#include
using namespace std;
// Sn = a + aa + aaa + ... + (n个a)
// uA表示a
// uN表示n
// 返回值为Sn
unsigned int SigmaN(unsigned int uA, unsigned int uN);
// Re = n个a
// uA表示a
// uN表示n
// uH表示a的位数(十进制)
// 返回值为Re
unsigned int Recursive(const unsigned int uA, const unsigned int uN, const unsigned int uH);
int main()
{
unsigned int a;
unsigned int n;
cout<<"Sn = a + aa + aaa + ... + (n个a)"<
cout<<"请输入n值:";
cin>>n;
cout<<"Sn = "<
system("pause");
return 0;
};
unsigned int SigmaN(unsigned int uA, unsigned int uN)
{
// 判断a值和n值,如果其中任何一个为0则直接返回0
if ((0 == uA)||(0 == uN))
{
return 0;
}
// 判断a值是几位数
const unsigned int uDecimal = 10; // 十进制的进制
unsigned int uMedian = 1; // 存贮a值的位数
unsigned int uTemp = uA; // 临时存放a值
bool bIsFinish = false; // 是否结束判断循环
do
{
uTemp -= uDecimal*uMedian; // a值减去某位数的最小
if (uTemp > uA) // 若a值为负(这里使用的是无符号整形,计算为负时数据溢出为一个极大值,所以比原来大。这里不是很严谨,不适用于大数的计算。)
{
bIsFinish = true; // 得到实际位数,准备结束循环
}
else
{
uTemp = uA; // 没有得到实际位数,重置临时变量为原始a值
uMedian++; // 位数自加
}
} while (!bIsFinish);
unsigned int uHex = 1; // 存放a值到aa值的进制(待以下循环计算得出)
for (unsigned int u = 0; u < uMedian; u++)
{
uHex *= uDecimal;
}
// 计算Sn
unsigned int uSn = 0; // 初始化Sn
for (unsigned int u = 0; u < uN; u++)
{
uSn += Recursive(uA, u+1, uHex);
}
return uSn;
}
unsigned int Recursive(const unsigned int uA, const unsigned int uN, const unsigned int uH)
{
// 若n值为1,则直接返回a值
if (1 == uN)
{
return uA;
}
else
{
unsigned int uHex = uH; // 这一层实际应乘以的进制(待以下循环计算得出)
for (unsigned int i = 2; i < uN; i++)
{
uHex *= uH;
}
return uA*uHex+Recursive(uA, uN-1, uH);
}
}
// 我只是考虑了a值可能是十位数、百位数之类的,哪里逻辑混乱了?
楼上的做的很复杂,而且逻辑较乱。
但是能实现。
楼主看这个。
#include
int main()
{
int n,a;
printf("请输入你要n和a:\n");
scanf("%d %d",&n,&a);
int sum=0;
for(int i=0;i
a+=a*10;
sum+=a;
}
printf("sum=%d.\n",sum);
return 0;
}
#include
void main()
{
int sum=0;
int a=2;
int n;
scanf("%d", &n);
for(int i=1;i<=n;i++ )
{
sum =sum + a;
a = (a*10+2); // 需不断更新a,
}
printf("%d",sum);
}