A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

之前在论坛里看到一道题说给出指定数字输出每一位都取得其补数的相反数比如 输入52321则输出-58789
思路如下
1利用int类型不纪录小数位的特点求出数字位数,即将输入的数字多次除以10,结果为0的时候则该运算运行的次数就是数字的位数。
2从最大位开始,利用int不纪录小数位的特点取该位数字的数值并计算该位的补数依次相减即可得到最终结果
注意:0的补数是0计算时应做判断
  1. /*
  2. 模块功能:给出指定数字,计算每一位的补数。如给出554输出-556。
  3. 时间:2015年11月1日。

  4. */
  5. #include <stdio.h>
  6. //全局变量
  7. int i = 1;//记录位数
  8. int num = 0;//输入数字
  9. int result = 0;//记录除位结果
  10. int divisor = 1;//记录最大数位
  11. int final = 0;//最终结果
  12. int j = 0;//递推循环次数纪录
  13. int main(int argc, const char * argv[]) {
  14.     int InvNum(int x);//声明求反函数(带参数x=位数制定循环次数)
  15.     int GetDigit();//声明求位数函数
  16.     printf("请输入数字:");
  17.     scanf("%d",&num);//输入题目
  18.     result = num;
  19.    
  20.     GetDigit();//step1
  21.     printf("\nGetDigit() = %d,divisor = %d,i = %d,num = %d\n",GetDigit(),divisor,i,num);
  22.     j = 0;
  23.     InvNum(i);//step2
  24.     return 0;
  25. }
  26. /**
  27. *  取得输入数字位数
  28. *
  29. *  @return 返回输入数字位数
  30. */
  31. int GetDigit()
  32. {
  33.     j++;
  34.     printf("第%d次递推!",j);
  35.     result = result/10;//递推 result每次除以10则少一位i+1,至result=0时i=位数
  36.     if(result == 0){
  37.         return i;
  38.            }else
  39.     {
  40.         divisor = 10*divisor;
  41.         i++;
  42.         GetDigit();
  43.          return 0;
  44.     }
  45. }
  46. /**
  47. *  求得每一位与10的差值的相反数并求和
  48. *
  49. *  @param x 循环次数;根据输入数字位数决定
  50. *
  51. *  @return
  52. */
  53. int InvNum(int x){
  54.     for(;x>0;){//根据参数决定循环次数
  55.         j++;
  56.         printf("第%d次循环!",j);
  57.         //判断如果该位=0则不参与计算
  58.         if(num/divisor == 0){
  59.             num = num-num/divisor*divisor;
  60.             divisor = divisor/10;
  61.             x--;}
  62.             else{
  63.                  final = final+(num/divisor-10)*divisor;//自最高到最低依次求得每一位数字的相反补数
  64.                  num = num-num/divisor*divisor;
  65.                  divisor = divisor/10;
  66.                  x--;}}
  67.     printf("\nfinal = %d\n",final);
  68.     return 0;
  69. }
复制代码

屏幕快照 2015-11-03 18.54.09.png (78.4 KB, 下载次数: 13)

屏幕快照 2015-11-03 18.54.09.png

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马