编程题
史丰收速算 ### 题目描述 **本题为代码补全填空题,请将题目中给出的源代码补全,并复制到右侧代码框中,选择对应的编译语言(C/Java)后进行提交。若题目中给出的源代码语言不唯一,则只需选择其一进行补全提交即可。复制后需将源代码中填空部分的下划线删掉,填上你的答案。提交后若未能通过,除考虑填空部分出错外,还需注意是否因在复制后有改动非填空部分产生错误。** 史丰收速算法的革命性贡献是:从高位算起,预测进位。不需要九九表,彻底颠覆了传统手算! 速算的核心基础是:1 位数乘以多位数的乘法。 其中,乘以 7 是最复杂的,就以它为例。 因为,1/7 是个循环小数:0.142857...,如果多位数超过 142857...,就要进 1。 同理,2/7, 3/7, ... 6/7 也都是类似的循环小数,多位数超过 $n$/7,就要进 $n$。 下面的程序模拟了史丰收速算法中乘以7的运算过程。 乘以 7 的个位规律是:偶数乘以 2,奇数乘以 2 再加 5,都只取个位。 乘以 7 的进位规律是: ```txt 满 142857... 进 1, 满 285714... 进 2, 满 428571... 进 3, 满 571428... 进 4, 满 714285... 进 5, 满 857142... 进 6。 ``` 请分析程序流程,填写划线部分缺少的代码。 **C** ```c #include #include // 模拟 史丰收速算法 多位数乘以 7 的计算过程 //计算个位 int ge_wei(int a) { if(a % 2 == 0) return (a * 2) % 10; else return (a * 2 + 5) % 10; } //计算进位 int jin_wei(int a, char* p) { char* level[] = { "142857", "285714", "428571", "571428", "714285", "857142" }; char buf[7]; buf[6] = '\0'; strncpy(buf,p,6); int i; for(i=5; i>=0; i--){ int r = strcmp(level[i], buf); if(r<0) return i+1; while(r==0){ p += 6; strncpy(buf,p,6); r = strcmp(level[i], buf); if(r<0) return i+1; _________________________; } } return 0; } //多位数乘以7 void f(char* s) { int head = jin_wei(0,s); if(head > 0) printf("%d", head); char* p = s; while(*p){ int a = (*p-'0'); int x = (ge_wei(a) + jin_wei(a,p+1)) % 10; printf("%d",x); p++; } printf("\n"); } int main() { f("1847255097268459"); f("1428571428571"); f("1428571428572"); f("4285714285714286"); return 0; } ```
查看答案
赣ICP备20007335号-2