连续两次写入数字的逻辑错误(C ++)

问题描述 投票:-3回答:1

我一直在尝试用C ++实现一些东西,但显然有一个语法错误。

  1. 当输入31作为输入时,以下代码产生“1 3100”: #include<iostream> #include<cmath> using namespace std; int main() { long long n; cin>>n; long long j = floor((log10(n))); long long nn = (n*((long long)pow(10,j+1)))+n; cout<<j<<" "<<nn; }
  2. 以下代码为同一输入产生“1 3130”,即31: #include<iostream> #include<cmath> using namespace std; int main() { long long n; cin>>n; long long j = floor((log10(n))); long long nn = (n*(pow(10,j+1)))+n; cout<<j<<" "<<nn; }

我希望为输入31生成“1 3131”。基本上,我试图连续两次写入数字:当您将数字解析为字符串并添加相同的字符串两次时(例如, n = 11,解析为s =“11”然后产生s + s)。 所以我想将输入乘以适当的10的幂来获得足够的“尾随零”,然后再次添加输入。

我哪里错了?另外,为什么上述两个代码之间存在差异? (请解释为什么第一个代码将其作为输出,第二个代码作为输出,并帮助我使用更新的代码来获得所需的输出)。

c++ syntax-error
1个回答
3
投票

没有语法错误,否则您的代码无法以可执行文件的形式运行。

对“3130”的意外输出的解释是在整数上下文中滥用浮点函数。

long long n; cin>>n; // n becomes 31
long long j = floor((log10(n))); // j becomes 1
long long nn = (n*(pow(10,j+1)))+n; // the result from pow is a floating point just below 100
// integer-multiplied by 31 gives 3099
// adding 31 results in 3130
cout<<j<<" "<<nn; // output 3130
© www.soinside.com 2019 - 2024. All rights reserved.