不同进制数的比较与转换:C语言实现

本文分析了两个C语言程序,它们旨在判断两个输入的字符串在2到36进制下是否表示相同的数值。程序的核心逻辑是将字符串转换为对应的数值,并遍历所有可能的进制进行比较。

程序差异:

这两个程序唯一的区别在于其中一个程序包含以下代码行:cprintf('%d.%d ',q[0],w[0]);

这行代码的功能是输出两个字符串第一个字符的ASCII码值,并用小数点连接。

结果差异:

由于这行代码的存在,两个程序的输出结果可能不同。这是因为在后续的进制转换过程中,程序将字符的ASCII码值作为计算依据,而非字符本身。输出ASCII码值会改变后续计算中使用的数值,进而导致结果差异。

修正后的代码:

以下代码移除了输出ASCII码值的部分,保证了两个程序的功能一致性:c#include<stdio.h>#include<math.h>#include <stdbool.h>

int main() { char m[20], n[20]; int max1 = 0, max2 = 0, q[20] = {211}, w[20] = {211}, i = 0; scanf('%s', m); scanf('%s', n); for (int r = 0; m[r] != '�'; r++) { q[r] = m[r]; if (q[r] > 64 && q[r] != 211) q[r] = q[r] - 54; else if (q[r] < 64 && q[r] != 211) q[r] = q[r] - 48; } for (int r = 0; n[r] != '�'; r++) { w[r] = n[r]; if (w[r] > 64 && w[r] != 211) w[r] = w[r] - 54; else if (w[r] < 64 && w[r] != 211) w[r] = w[r] - 48; } max1 = q[0]; max2 = w[0]; while (q[i] != 0) { max1 = (max1 < q[i]) ? q[i] : max1; i++; } i = 0; while (w[i] != 0) { max2 = (max2 < w[i]) ? w[i] : max2; i++; } int num1[37 - max1], num2[37 - max2]; i = 0; for (int r = max1, u = 0; r <= 36; r++, u++) { while (q[i] != 0) { num1[u] += q[i] * pow(r, i); i++; } } i = 0; for (int r = max2, u = 0; r <= 36; r++, u++) { while (w[i] != 0) { num2[u] += w[i] * pow(r, i); i++; } } for (int r = 0; r < 37 - max1; r++) for (int j = 0; j < 37 - max2; j++) if (num1[r] == num2[j]) { printf('%s (base %d) = %s (base %d) ', m, r, n, j); i = 100; goto k; }k: if (i != 100) printf('%s is not equal to %s in any base 2..36 ', m, n); return 0;}

总结:

本文通过分析两个C语言程序的差异,解释了输出语句对程序结果的影响。并提供了修正后的代码,确保了程序功能的正确性和一致性。

不同进制数的比较与转换:C语言实现

原文地址: https://www.cveoy.top/t/topic/PFq 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录