重写:小学生数学

小学生数学
很多小学生在学习加法时,发现“进位”特别容易出错。你的任务是计算两个数在相加时需要多少次进位。你编制的程序应当可以连续处理多组数据,直到读到两个0(这是输入结束标记)。

样例:

输入
123 456
555 555
123 594
0 0

输出:
0
3
1

首先感谢  garbageMan 的代码,下面代码全部引用自他的 C语言初学者代码中的常见错误与瑕疵(4) 。 仅做少量修改。

先说下为何再写一遍,以为我想看看我自己写的代码到底是什么个样子。其次,向人家学习学习。

大家如果不喜欢的话,多骂几句,先行谢过。

下面代码是依据 garbageMan 的评论对代码进行修改后的结果。

/*
  出处:http://www.cnblogs.com/pmer/p/3428526.html 
*/ 
#include <stdio.h>

#define clear_stdin() do { } while (fgetc(stdin) != '
')

unsigned count_carry_for_add(unsigned a, unsigned b);
int get_numbers(unsigned *a, unsigned *b);

int main( void )
{
	unsigned a = 0u;
	unsigned b = 0u;
   
	while (get_numbers(&a, &b) == 0){
		printf("%u
", count_carry_for_add(a, b));
	}
     
	return 0;
}

int get_numbers(unsigned *a, unsigned *b)
{
	while ( puts("Please input Two Unsigned Integer(0 0 for exit):")
		, scanf("%u%u", a, b) != 2){	
		fprintf(stderr, "Input invalid!!
");
		clear_stdin();
	}

	if (*a == 0u && *b == 0u){
		return 1;
	}
 
	return 0;
}

unsigned count_carry_for_add(unsigned a, unsigned b)
{
	unsigned count = 0u ;//进位次数 
	unsigned carry = 0u ;//进位 
   
	do {
		carry = ((a%10u + b%10u) + carry) / 10u ;
		if (carry > 0 ){
			++count;
		}
         
		a /= 10u;
		b /= 10u;
	} while (a != 0 || b != 0);
   
	return count;
}

 总结:

注意程序主体的模块化

原文地址:https://www.cnblogs.com/playerc/p/3431584.html