之前在论坛里看到一道题说给出指定数字输出每一位都取得其补数的相反数比如 输入52321则输出-58789
思路如下
1利用int类型不纪录小数位的特点求出数字位数,即将输入的数字多次除以10,结果为0的时候则该运算运行的次数就是数字的位数。
2从最大位开始,利用int不纪录小数位的特点取该位数字的数值并计算该位的补数依次相减即可得到最终结果
注意:0的补数是0计算时应做判断
- /*
- 模块功能:给出指定数字,计算每一位的补数。如给出554输出-556。
- 时间:2015年11月1日。
-
- */
- #include <stdio.h>
- //全局变量
- int i = 1;//记录位数
- int num = 0;//输入数字
- int result = 0;//记录除位结果
- int divisor = 1;//记录最大数位
- int final = 0;//最终结果
- int j = 0;//递推循环次数纪录
- int main(int argc, const char * argv[]) {
- int InvNum(int x);//声明求反函数(带参数x=位数制定循环次数)
- int GetDigit();//声明求位数函数
- printf("请输入数字:");
- scanf("%d",&num);//输入题目
- result = num;
-
- GetDigit();//step1
- printf("\nGetDigit() = %d,divisor = %d,i = %d,num = %d\n",GetDigit(),divisor,i,num);
- j = 0;
- InvNum(i);//step2
- return 0;
- }
- /**
- * 取得输入数字位数
- *
- * @return 返回输入数字位数
- */
- int GetDigit()
- {
- j++;
- printf("第%d次递推!",j);
- result = result/10;//递推 result每次除以10则少一位i+1,至result=0时i=位数
- if(result == 0){
- return i;
- }else
- {
- divisor = 10*divisor;
- i++;
- GetDigit();
- return 0;
- }
- }
- /**
- * 求得每一位与10的差值的相反数并求和
- *
- * @param x 循环次数;根据输入数字位数决定
- *
- * @return
- */
- int InvNum(int x){
- for(;x>0;){//根据参数决定循环次数
- j++;
- printf("第%d次循环!",j);
- //判断如果该位=0则不参与计算
- if(num/divisor == 0){
- num = num-num/divisor*divisor;
- divisor = divisor/10;
- x--;}
- else{
- final = final+(num/divisor-10)*divisor;//自最高到最低依次求得每一位数字的相反补数
- num = num-num/divisor*divisor;
- divisor = divisor/10;
- x--;}}
- printf("\nfinal = %d\n",final);
- return 0;
- }
复制代码 |
|