在序列a1,a2,…,an中,对于i>1,ai是满足下面两个性质的最小正整数:

在序列a1,a2,…,an中,对于i>1,ai是满足下面两个性质的最小正整数:

(1) ai > ai-1;
(2) ai 的各位数字的和与K×ai-1的各位数字的和相等。

例如,当a1=1, k=2时,该序列的前6个元素是1,2,4,8,16,23。给定a1,k,n,计算该序列的第n项an的值。程序的输入数据从标准输入中读入,只有一行,包含3个整数a1、k、n,(0 < a1,k,n < 100000),计算结果an≤105000。计算结果an写入标准输出,占一行。例如,当输入数据为1 2 6时,输出结果为23

  // ttt.cpp : Defines the entry point for the console application.
  //

  #include "iostream.h"

  int main(int argc, char* argv[])
  {
  int x,a[10],k,n,i,b[10],j,s,t,t2,s2,t0;
  //数组a,b初始化为0
  for(i=0;i<10;i++)
  {
  a[i]=0;
  b[i]=0;
  }
  //a[0]中保存第一个数列的值
  a[0]=1;
  k=3;
  n=6;//执行n-1次循环,第一次求第二项,第n-1次求第n项
  s=0;
  for(i=1;i<n;i++)
  {
  //把数组中保存的值转换为十进制数后存入s,这是为了方便后边的代码能进行比较和自加运算
  j=0;t=1;s=0;
  while(a[j]!=0)
  {
  s+=a[j]*t;
  j++;t=t*10;
  }

  j=0;x=s;s=s*k;
  while(s>0)
  {
  a[j]=s%10;
  s=s/10;j++;
  }
  //计算k*s的各位数的和保存入s中
  s=0;j=0;
  while(a[j]!=0)
  {
  s+=a[j];
  j++;
  }
  //从s+1之后的数开始检验,该数各位数之和是否和前边的和相等
  t2=x+1;j=0;
  while(1)
  {
  t0=t2;j=0;
  while(t0>0)
  {
  b[j]=t0%10;
  t0=t0/10;j++;
  }

  s2=0;j=0;
  while(b[j]!=0)
  {
  s2+=b[j];
  j++;
  }
  if(s2==s) break;//如果求出的数较大,则不能把数保存在变量中用比较运算符比较,而应把数据的每一位保存到数组中,自己定义一个比较两个数组是否相等的函数
  t2++;//同上,较大的数保存在数组中,应自己定义一个自己运算的函数
  }

  j=0;
  while(b[j]!=0)
  {
  a[j]=b[j];
  j++;
  }

  }

  for(i=9;i>=0;i--)
  cout<<a[i];
  return 0;
  }
温馨提示:答案为网友推荐,仅供参考
相似回答