之所以写这一题是因为,同学普遍表示我的代码略短,而且我第二次看自己代码时也被自己震惊了= =||
核心思想并无不同
关键在于for循环与while的嵌套节省了大量的判断长度。
代码简洁的最主要因素是算法,逻辑复杂可能会增长代码长度。
此处我的逻辑是:
第一次比较时,若小于,直接break。
从第二次开始,用所选长度数字,用相同位数的数字做减法。
若所选的数字的前一位等于零,且不能再做减法,向下移位。
用tempint统计每一位的值,放入最终结果
(。??)ノ
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 int main(int argc, char *argv[]){ 6 string a, b, substring; 7 int i, j, k; 8 int tempint; 9 int number = 0; 10 int size_a = 0, size_b = 0; 11 int result[300] = {0}; 12 cin>>a>>b; 13 14 size_a = a.size(); 15 size_b = b.size(); 16 // 第一位开始,从高位到低位计算结果 17 for(i = 0; i <= size_a - size_b; ++i){ 18 substring = a.substr(i, i + size_b); 19 // 统计每一位的值,number<=9 20 number = 0; 21 while(true){ 22 if(i == 0 && substring < b) break; // 第一次的特殊情况 23 if(i != 0 && substring < b && a[i-1] == ‘0‘) break; // 第二次循环及以后的停止条件 24 for(j = i + size_b - 1, k = size_b - 1; j >= i; --j, --k){ 25 tempint = a[j] - b[k]; 26 if(tempint < 0) { 27 a[j - 1] -= 1; 28 tempint += 10; 29 } 30 a[j] = tempint + ‘0‘; 31 } // 上方for循环用于计算每一位 32 ++number; 33 substring = a.substr(i, i + size_b); // 刷新 34 } 35 result[i] = number; 36 } 37 if(result[0]!=0){ 38 cout << result[0]; 39 } 40 for(i = 1; i <= size_a - size_b; ++i){ 41 // 输出 42 cout << result[i]; 43 } 44 return 0; 45 }
时间: 2024-10-28 15:39:07