是否可以仅使用 C 中的 int 类型将 3.005 添加到 4.70?
Is it possible to add 3.005 to 4.70 only using int types in C?
我被要求输入两个数字,例如 3.005、3.70,并在不使用 float 或 double 的情况下对它们进行加、减和乘。不知何故,我设法做了一些类似于我被问到的事情。我单独输入数字。如果我输入“3.005”,我首先输入 3,然后我输入 .005。但是由于 005 不等于 0.005 我遇到了问题。例如,我输入 3.005 和 4.70,当我添加它们时,我得到 7.75,这是不正确的。我该如何解决?这就是我输入价值观的方式。
printf("first number:");
scanf("%d.%d",&n1.integer,&n1.fraction);
printf("second number:");
scanf("%d.%d",&n2.integer,&n2.fraction);
这是我添加两个值的函数。
int add(n1,f1,n2,f2,n1digit,n2digit){ //n1-2digit is number of digits of n1-2's fraction.
int t;
int y=1;
int fraction;
int integer;
if (n1digit>n2digit){
t=n1digit;
}
else if (n2digit>n1digit){
t=n2digit;
}
else {
t=n2digit;
}
fraction=f1+f2;
integer=n1+n2;
int temp=fraction;
int i=0;
while (temp>0){
temp=temp/10;
i=i+1;
}
if (i>t){
integer=integer+1;
y=pow(10,i-1);
fraction=fraction%y;
}
printf("%d.%d\n",integer,fraction);
以千为单位输入数字3005
和3700
,最后除以1000.0
。
根据您在@ruohola 的回答中发布的提示,您可以执行以下操作:
- 定义最大小数位数,例如3 或 6
- 读取数字为字符串,使用
strtol()
转换整数部分。并跳过“。”
- 如果小数部分比小数位数短,则附加相应的'0',因此'70'变为'700'或'700000','5'变为'500'或'500000 '
- 使用
strtoul()
将该数字存储到另一个(无符号)整数值
现在你有两个整数值,代表可以完成剩下的事情
为了允许数字的灵活性而不要求它们相同,阅读时请注意偏移量 "%n"
。
int o1, o2
printf("first number:");
// scanf("%d.%d",&n1.integer,&n1.fraction);
scanf("%d.%n%d%n",&n1.integer,&o1, &n1.fraction, &o2);
int n1digit = o2 - o1;
n2
分母相同
将整数部分的符号应用到小数部分。 OP 的代码不会这样做。
分数相加时先求10的次方,然后分数相加。
注意:此方法因 "-1. 23", "1.-23", "12."
等病态输入而失败
我被要求输入两个数字,例如 3.005、3.70,并在不使用 float 或 double 的情况下对它们进行加、减和乘。不知何故,我设法做了一些类似于我被问到的事情。我单独输入数字。如果我输入“3.005”,我首先输入 3,然后我输入 .005。但是由于 005 不等于 0.005 我遇到了问题。例如,我输入 3.005 和 4.70,当我添加它们时,我得到 7.75,这是不正确的。我该如何解决?这就是我输入价值观的方式。
printf("first number:");
scanf("%d.%d",&n1.integer,&n1.fraction);
printf("second number:");
scanf("%d.%d",&n2.integer,&n2.fraction);
这是我添加两个值的函数。
int add(n1,f1,n2,f2,n1digit,n2digit){ //n1-2digit is number of digits of n1-2's fraction.
int t;
int y=1;
int fraction;
int integer;
if (n1digit>n2digit){
t=n1digit;
}
else if (n2digit>n1digit){
t=n2digit;
}
else {
t=n2digit;
}
fraction=f1+f2;
integer=n1+n2;
int temp=fraction;
int i=0;
while (temp>0){
temp=temp/10;
i=i+1;
}
if (i>t){
integer=integer+1;
y=pow(10,i-1);
fraction=fraction%y;
}
printf("%d.%d\n",integer,fraction);
以千为单位输入数字3005
和3700
,最后除以1000.0
。
根据您在@ruohola 的回答中发布的提示,您可以执行以下操作:
- 定义最大小数位数,例如3 或 6
- 读取数字为字符串,使用
strtol()
转换整数部分。并跳过“。” - 如果小数部分比小数位数短,则附加相应的'0',因此'70'变为'700'或'700000','5'变为'500'或'500000 '
- 使用
strtoul()
将该数字存储到另一个(无符号)整数值
现在你有两个整数值,代表可以完成剩下的事情
为了允许数字的灵活性而不要求它们相同,阅读时请注意偏移量 "%n"
。
int o1, o2
printf("first number:");
// scanf("%d.%d",&n1.integer,&n1.fraction);
scanf("%d.%n%d%n",&n1.integer,&o1, &n1.fraction, &o2);
int n1digit = o2 - o1;
n2
分母相同
将整数部分的符号应用到小数部分。 OP 的代码不会这样做。
分数相加时先求10的次方,然后分数相加。
注意:此方法因 "-1. 23", "1.-23", "12."
等病态输入而失败