可以写一下这个程序吗》或者告诉我思路也行,谢谢。
输入一个整数,你的任务是计算并输出这个整数的反数。反数的定义如下:1.结尾非0的正整数的反数就是一般的取反概念:12的反数为21
2.负数的反数仍是负数:-12的反数为-21
3.结尾为0的正整数的反数为:1200的反数为2100
我不清楚输入的数究竟有几位,然后怎么变化它们呢,以前知道输入的是几位数,可以用%或/1000什么的来变换,现在怎办呢?
程序代码:#include<stdio.h>
int main()
{
char c=' ';//对字符c初始化
int a[50],i=0,j,t,t1,t2,u;//声明下列要用到的变量
t=t1=t2=u=0;//t t1 t2 u都为状态变量,统一赋初值为0
while (c!='\n')
{
if (!i)c=getchar();//当第一个字符第时的位置
a[i]=c-48;//字符的ASCII码与数字的值相差48
if (!a[i])//当输入数字0时
{
!t2;//t2为记录字符中间的有没有0位
t++;
}
//记录末尾为0位的个数
else t=0;
if (i)c=getchar();//第二个字符之后输入的位置,目的是避免换行符对执行运算的干扰
i++;
}
if (t)t2=0;//如果末尾数字为0则下面将要执行t2条件就不成立
t1=t;//把末尾0位的个数赋值给t1,t1的作用是记录末尾数字0的个数
if (!a[0])//数字首位不能为0
{
printf("数字首位不能为0\n");
return 0;
}
if (a[0]<0)printf("-");//当输入负数时要打印负号
for (j=i-2;j>0;j--)
{
if (t>1)//当执行循环对应的运算字符末尾数字为0时
{
t--;
continue;//跳过循环,等于暂时对末尾数字0的情况不作处理
}
if (a[j+1]||u)//当末尾数字不为0时且状态变量u不为0时
printf("%d",a[j+1]);
if (t==1&&t2)printf("0");/*状态变量t2作用就在这里补0
(虽然本人也不完全明白其中逻辑关系,但经测试是要加的)*/
else
{
if (!a[i+1])//如果末尾数字为0
printf("0");//输出末尾的数字0(虽然本人也不完全明白其中逻辑关系,但经测试是要加的)
u=1;//u=1时意思是最多只有一次不执行上方的条件
}
}
if (a[0]>0)printf("%d",a[0]);
for (t=t1;t>0;t--)
printf("0");//输出末尾数字为0的个数
printf("\n");
}//最后,这个程序还有一个小问题,也就是输入0时会……但这个漏洞很容易修改,就请多多原谅吧
//抱歉,本人也有考虑把运算部分在非主函数体里执行,但看上去整个程序的整体性较强,改写函数体比较麻烦,不便之处请多多原谅[此贴子已经被作者于2016-10-27 00:19编辑过]
