[英]C program for computing greatest common divisor gives wrong answer
我編寫了以下程序,該程序從命令行獲取兩個數字並返回這些數字的 gcd。
#include <stdio.h>
int to_int(char *input)
{
return *input - '0';
}
int main(int argc, char *argv[])
{
if (argc < 2) return 1;
int a = to_int(argv[1]);
int b = to_int(argv[2]);
int i;
int result;
for (i = 1; i <= a && i <= b; i++) {
if (a%i==0 && b%i==0) {
result = i;
}
}
printf("%d\n", result);
return 0;
}
但是,當我給它數字 4 和 16 時,它會返回答案 1。這是不正確的。 4 和 16 的 gcd 是 4。但是我找不到我的代碼有什么問題。 我在互聯網上找到的其他示例似乎使用了我正在使用的相同算法(測試兩個數字是否可以被 i 整除,如果它們是則 gcd 為 i)。
有人可以指出我的代碼中的錯誤嗎?
你的to_int
function 沒有按照你的想法做。
表達式*input - '0'
獲取input
中第一個字符的字符代碼並減去'0'
的字符代碼。 所以結果是給定字符串的第一個字符對應的數字,而不是整個字符串。
您需要在循環中執行此操作,將結果乘以 10,然后再添加下一位的值。
一些額外的建議:(閱讀在線評論)
// if (argc < 2) return 1;//need argc to be 3
// (argv[0] always contains program name)
if (argc < 3) return 1;//test for num arguments
if(!(is_num(argv[1]) && is_num(argv[2]))) return 1;//test for number
int a = atoi(argv[1]);//when available use library functions
int b = atoi(argv[2]);
int max = a>b?a:b;// determine larger of two inputs
int i;
int result= 0;
//for (i = 1; i <= a && i <= b; i++) {//this is backwards,count from largest
for (i = max; i >= 1 ; i--) {//start at max, then decrement i
if (a%i==0 && b%i==0) {
result = i;
break;//break out of loop when solution found
}
}
printf("%d\n", result);
return 0;
如果需要支持 function,請創建一個以驗證輸入是否為數字:
bool is_num(char *input)
{
if(!input) return false;
int len = strlen(input);
if(!((input[0] == '-') || (input[0] == '+') || (isdigit(input[0])))) return false;
for(int i = 1;i<len;i++)
{
if(!isdigit(input[i])) return false;
}
return true;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.