数字之和程序没有为更大的数字提供正确的o / p

时间:2015-05-21 10:31:57

标签: c scanf

我写了一个程序来查找数字之和。当我使用号码说10位数时,我得到的答案不正确。

例如,如果我将输入设为function open_Callback(h, eventdata) [file_name, mach_path] = uigetfile( ... {'*.mat', 'All MAT-Files (*.mat)'}, ... 'Select File'); % If "Cancel" is selected then return if isequal([file_name,mach_path],[0,0]) return % Otherwise construct the fullfilename and Check and load the file end filename=file_name; length_fn=length(filename); st_pt=length_fn+1-4; file_ext=filename(st_pt:length_fn); if upper(file_ext) == '.mat' % if the file is a mat file data = load(file_name); figure imagesc(data.sinogram), colormap(hot) title(data.txt) else msgbox('That was NOT a MAT file!','ERROR','error','modal') disp('That was NOT a MAT file!') end end ,则输出为9999999999。以下是我目前的代码:

46

3 个答案:

答案 0 :(得分:6)

value[]太大了值String.substring()

参考:9999999999标准,章节§5.2.4.2.1,

int

尝试使用更大的数据类型,例如C11INT_MAX +32767 UINT_MAX 65535 LONG_MAX +2147483647 ULONG_MAX 4294967295 LLONG_MAX +9223372036854775807 ULLONG_MAX 18446744073709551615 。您应该对使用的数据类型使用适当的转换说明符。

作为备注,long long int的推荐签名为unsigned long long int

答案 1 :(得分:1)

如果您运行以下简单程序

#include <stdio.h>
#include <limits.h>

int main(void) 
{
    printf( "INT_MAX = %d\n", INT_MAX );
    printf( "LLONG_MAX = %lld\n", LLONG_MAX );

    return 0;
}

当您看到类似于以下

的输出时
INT_MAX = 2147483647
LLONG_MAX = 9223372036854775807

因此,值9999999999无法存储在int类型的对象中,因为它大于INT_MAX。 因此,定义变量值,如

long long int value;

或者甚至将它定义为

更好
unsigned long long int value;

因为您的输入不期望负值。在这种情况下,您必须使用格式说明符%llu。例如

scanf( "%llu", &value );

此代码sniipet

while((value/10)>0)
{
    rem=value%10;
    sum=sum+rem;
    value=value/10;
}
sum=sum+value;

您可以替换以下更简单且逻辑上更一致的代码段

do
{
    sum += value % 10;
} while ( value /= 10 );

答案 2 :(得分:1)

您正在使用

int sum,value,rem;

声明整数变量。变量sum保留了最终的补充答案。将您的变量类型更改为long intdouble。它应该看起来像

int value,rem;
long int sum 

int value,rem;
double sum; 

由于数据类型int无法容纳您的10位数字,因此会导致溢出。使用doublelong int可能会解决您的问题。