`
aniu2008
  • 浏览: 42709 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

迅雷招聘题:2009的2009次方,所得数各位数字求和,结果继续求和,直到剩下一位数字,需要几次求和运算??

阅读更多
2009的2009次方,所得数各位数字求和,结果继续求和,直到剩下一位数字,需要几次求和运算?? 收藏
迅雷2010招聘海报上的题目.

#include <iostream>
#include <vector>
using namespace std;


const int N = 7000;

void smooth(vector<int>& vr){
int i = vr.size();
for (int m = i-1;m>0;m--)
{
  if(vr[m]>=10){
   vr[m-1] += vr[m]/10;
   vr[m] = vr[m]%10;
  }
}
}

void doplus(vector<int>vr1,vector<int>&vr2,int i){
vector<int>::iterator it;
int n =vr1.size();
for (int m =n-1;m>=0;m--)
{
  vr2[n--]= vr1[m] * i;//从最后一位
}
smooth(vr2);
}

void add(vector<int>& vr1,vector<int>& vr2,vector<int>& vr3){
int i = vr1.size();

for (int m=i-1;m>=0;m--)
  vr3[m]=vr1[m]; //vr3后3位为0
int n= vr3.size()-1;
int p =vr2.size()-1;
for (;p>=0;p--)
{
  vr3[n--] +=vr2[p];
}

smooth(vr3);
}

void update(vector<int>&vr1,vector<int>& vr2){
int i = vr2.size();
int a=N-1;
for (int m=i-1;m>=0;m--)
{
  vr1[a--] = vr2[m];
}

}
void plus2009(vector<int>& vector1){

vector<int>::iterator it;
int i =0;
for(it = vector1.begin();*it == 0 && it !=vector1.end();++it)
  i++;

int bit = N - i;


  vector<int>vector2(bit+1);//赋值
  vector<int>vector3(bit+1);//赋值
  vector<int>vector4(bit);//vector1有效数字 的副本

  vector<int>::iterator it2;
  for (it2 =vector4.begin();it!=vector1.end();++it2,++it)
  {
  *it2 = *it;
  }

  doplus(vector4,vector2,2);// ×2 放入新数组
   doplus(vector4,vector3,9);//X9放入新数组

   int m= vector2.size();
   vector<int>vr3(m+3);

   add(vector2,vector3,vr3);

   update(vector1,vr3);//赋值到原数组

}

int main(){
vector<int>vector1(N);
vector1[N-1]=9;
vector1[N-2]=0;
vector1[N-3]=0;
vector1[N-4]=2;

cout<<"2009的"<<"2009次方: "<<endl;

for(int i = 1;i<=2008;i++) //2009次方
plus2009(vector1);


  vector<int>::iterator it;
bool z=0;
int number =0;


int sum = 0;//计算各个位数之和
int tamp=0;//统计数字玩,与题目无关

vector<int>vectornumber(10);//统计数字玩,与题目无关

for (it = vector1.begin();it!=vector1.end();++it){
  if(*it !=0)
    z =1;

  if(z){
   number++;
   cout<<*it;
      tamp = *it;
   vectornumber[tamp]++;
   sum += *it;
  }
}
cout<<endl;
cout<<"这个数的位数为 : "<<number;
cout<<"各个数字累加为: "<<sum<<endl;

int step = 1;//已经加了一步
while(sum > 10){
  int  sum2=0;
  while(sum != 0){
   sum2 += sum%10;
   sum = sum/10;
  }
  sum = sum2;
  step++;
}

cout<<"共需要加 "<<step<<"步"<<endl;
cout<<"最后数字为"<<sum<<endl;

vector<int>::iterator itnum;//统计数字玩,与题目无关
int fig=0;//统计数字玩,与题目无关
for (itnum = vectornumber.begin();itnum!=vectornumber.end();++itnum)
{
  cout<<fig++<<" :"<<*itnum<<endl;
}

getchar();
}

代码写的丑,本来想再整理下,又有其他事情就放下啦,将就吧 。其实把数字颠倒存储代码写的会更简单些,更好看些。以后慢慢修改吧 其实还可以提炼成更通用的代码 ,不仅仅是2009次方,还可以是任意次方,或者就是任意大的数相乘。既然有任意大数相乘算法了,我也就更懒得修改啦。

本来以为会有数学规律的,不需要暴力解答。但是我运行出来结果发现,竟然不符合我使用数学方法的归纳猜想。郁闷。数学解法我就没有继续探究啦。

2009的2009次方是个有着6636位数的数字,这些数字加起来和为30119,30119 再加为14,再加为5.

那么答案为3次



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/houxudongdongxu/archive/2009/10/15/4676646.aspx
分享到:
评论

相关推荐

    专升本C++复习题.docx

    5. "水仙花数"的输出:对于n位的水仙花数,需要计算每位数字的n次方和,判断是否等于原始数字。 6. 回文数的寻找:定义一个函数`bool huiwen(int n)`,检查数字是否为回文,然后在指定范围内查找满足条件的数。 7....

    微机课设,十进制数转换为二进制数求和

    4. **二进制到十进制转换**:可以使用位权相加的方法,即将二进制数的每一位乘以其对应的权重(2的n次方,n为该位的位置,从右向左计算),然后将所有结果相加得到十进制数。 5. **编程实现**:在ASM.asm文件中,很...

    专升本C++复习题.pdf

    可以使用模运算和除法来获取数字的每一位,然后进行相应的计算。 2. **数字逆序输出**:通过将数字转换为字符串,然后反向遍历字符串,可以得到逆序的数字。也可以用数学方法逐位处理。 3. **求整数位数并逆序输出...

    基于visual Studio2013解决C语言竞赛题之循环求和

    本教程将聚焦于如何利用Visual Studio 2013这一强大的集成开发环境(IDE)来编写一个计算从2的0次方到2的63次方的循环求和程序。在Visual Studio 2013中,C语言程序的开发流程包括创建项目、编写代码、编译和调试。...

    第四届 蓝桥杯 竞赛试题题目 C/C++高职高专组

    这些题目来自于第四届“蓝桥杯”全国软件专业人才设计与创业大赛的C/C++高职高专组竞赛,涵盖了一系列的编程与数学问题。以下是各题目的解析: 1. **猜年龄**:根据题目描述,美国数学家维纳年龄的立方是4位数,4...

    数字电子技术基础 第四版

    - **十六进制转二进制和十进制**:每一位十六进制数对应四位二进制数。十进制转换则采用十进制的加权求和方法。 - **十进制转二进制和十六进制**:二进制转十进制利用2的幂次方求和方式;十六进制转十进制类似,使用...

    长青中学2008-2009学年上期七年级数学竞赛试题【新课标人教版】精选.doc

    15. **数的表示**:16题涉及两位数的表示,交换十位和个位数字后,数值会变。 16. **倒数与相反数**:17题中,互为相反数相加为0,互为倒数相乘为1。 17. **数轴距离**:18题是数轴上的两点距离问题。 18. **温差...

    有理数混合运算习题PPT学习教案.pptx

    标题中的“有理数混合运算习题PPT学习教案”表明了这是一份关于有理数混合运算的教学材料,主要用于帮助学生理解和掌握有理数的运算规则和技巧。描述中的内容与标题一致,进一步确认了这是一个针对有理数运算的学习...

    python经典百题之水仙花数

    在循环内部,我们需要对数字的每一位进行提取并计算立方和。Python中可以使用整除和取余操作来获取数字的各位。`//` 运算符用于整除,`%` 运算符用于取余。例如,`num // 100` 得到百位数,`num % 100 // 10` 得到十...

    数字电子技术基础:第1章 逻辑代数基础.ppt

    例如,将一个八进制数(437.25)8转换为十进制数(287.328125)10,需要将每个位的数字乘以相应的8的幂次再求和。同样,十六进制数(3BE.C4)16转换为十进制数(958.765625)10,是将每个位的数字乘以16的相应幂次后再求和。...

    《数字电子技术基础》课后习题及参考答案.doc

    《数字电子技术基础》课程涉及了数字系统的基础知识,包括数制转换、编码和逻辑运算等。以下是这些习题中涉及的知识点的详细说明: 1. **数制转换**: - **十进制到二进制、八进制、十六进制**:十进制数可以通过...

    数字电路与逻辑设计课后答案

    对于二进制数转换成十进制数,可以将每个位上的数字与其对应的2的幂次相乘后求和。二进制转换为十六进制数则更加直接,因为二进制与十六进制都是2的幂次方的数制,可以通过将二进制数每四位一组转换成相应的十六进制...

    编程精确计算2的N次方 (N是介于100和1000之间的整数).zip

    描述中提到的“计算整数各位数字之和”是另一个相关的问题,它要求将一个整数的每一位数字相加,得到的结果称为数字之和。例如,如果输入的整数是123,那么它的数字之和就是1 + 2 + 3 = 6。这个任务经常在处理数字...

    七年级数学基础找规律习题汇总及答案.doc

    例如,题目中的多位数构造规则是:每位数字是由前一位数字乘以2得到,如果积是一位数则直接写在下一位,如果积是两位数则取个位数。这种问题锻炼学生的逻辑推理能力和模式识别能力。 2. **等差数列和等比数列**:...

    C语言编程实现输出100—999之间的水仙花数

    在探讨如何用C语言编程实现输出100到999之间的水仙花数之前,我们首先需要理解几个核心概念:水仙花数、循环结构、条件判断以及数学运算。 ### 水仙花数的概念 水仙花数(Narcissistic number),又称为自恋数或...

    计算机的算术运算.pdf

    二进制数到十进制的转换涉及将每一位二进制数的值乘以2的相应次方然后求和。反之,十进制转换为二进制则通常通过不断地除以2并取余数的方式来完成。 二进制数中还有两个重要的概念是LSB(Least Significant Bit,...

    c语言测试试题,不错哦

    - **位运算**:通过除法和模运算获取每一位数字。 - **条件判断**:使用 `if` 语句检查是否满足水仙花数的条件。 ### 知识点六:算法与排序 虽然第六题的部分代码缺失,但可以推测此题可能涉及对一组数据进行某种...

    第1章数字电子技术基础1.pptx

    【数字电子技术基础】是电子工程领域的重要基础知识,主要涵盖了数字信号、数字电路的基本概念、逻辑代数理论以及数字系统的分析和设计方法。本章的学习目标主要包括理解和掌握以下几个核心知识点: 1. **二进制与...

    七年级上册数学《有理数及其运算》全章练习题2北师大版.pdf

    4. **倒数**:一个数的倒数是与之相乘等于1的数,1和-1的倒数分别是1和-1。 5. **绝对值**:任何数的绝对值是非负的,例如-12的绝对值是12。 6. **有理数的大小关系**:根据数轴上的位置,可以判断数的大小,例如a...

Global site tag (gtag.js) - Google Analytics