我写了一个程序来查找数字之和。当我使用大号码说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
答案 0 :(得分:6)
value[]
太大了值String.substring()
。
参考:9999999999
标准,章节§5.2.4.2.1,
int
尝试使用更大的数据类型,例如C11
或INT_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 int
或double
。它应该看起来像
int value,rem;
long int sum
或
int value,rem;
double sum;
由于数据类型int
无法容纳您的10位数字,因此会导致溢出。使用double
或long int
可能会解决您的问题。