算法习题

1.

// 计算一个整数的位数.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>

using namespace std;


int wei(int a)
{
 static int total=0;
 if(a/1000000000!=0) return total=10;
 else if(a/100000000!=0) return total=9;
 else if(a/10000000!=0) return total=8;
 else if(a/1000000!=0) return total=7;
 else if(a/100000!=0) return total=6;
 else if(a/10000!=0) return total=5;
 else if(a/1000!=0) return total=4;
 else if(a/100!=0) return total=3;
 else if(a/10!=0) return total=2;
 else if(a%10!=0) return total=1;
}

int _tmain(int argc, _TCHAR* argv[])
{
 int a,b=1,c=1;
 cout<<"请输入一个整数"<<endl;
 cin>>a;
 cout<<wei(a)<<endl;
 for(int i=1;i<=9;++i)
 {
  b*=10;
  if(a/b!=0)++c;
 }
 cout<<c;
 return 0;
}

 2.

// 水仙花数.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;

int daffodil(int x)
{
 int ge,shi,bai,sum=0;
 ge=x%10;
 //cout<<ge<<endl;
 shi=(x/10)%10;
 //cout<<shi<<endl;
 bai=x/100;
// cout<<bai<<endl;
 sum=ge*ge*ge+shi*shi*shi+bai*bai*bai;
 return sum;
}

int _tmain(int argc, _TCHAR* argv[])
{
 int a;
 cout<<"请输入一个数a:";
 cin>>a;
 //cout<<daffodil(a);
 if(a==daffodil(a))
  cout<<"a是一个水仙花数"<<endl;
 else cout<<"a不是水仙花数"<<endl;

 return 0;
}

 3.

// 韩信点兵.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;
int hanxin(int a,int b,int c)
{
 int i=1;
 while(!(i%3==a&&i%5==b&&i%7==c)) ++i;
 return i;
 
}

int _tmain(int argc, _TCHAR* argv[])
{
 int x,y,z;
 cout<<"请输入个按各队列排列之后的余数:x(x<3),y(y<5),z(z<7)"<<endl;
 cin>>x>>y>>z;
 cout<<"总人数:"<<hanxin(x,y,z)<<endl;
 return 0;
}

 4.

// 倒三角形.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>

using namespace std;

void triangle(int n)
{
 for(int j=n;j>0;--j)
 {
  for(int k=0;k<n-j;++k)//输出前面的空格
   {cout<<" ";}
  for(int i=0;i<2*j-1;++i)//输出*
  {
  cout<<"*";
  }
  cout<<endl;
 }
}

int _tmain(int argc, _TCHAR* argv[])
{
 int a;
 cout<<"请输入倒三角形的层数:";
 cin>>a;
 triangle(a);//调用倒三角形
 return 0;
}

 5.

// 统计.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<vector>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
 int n,a,m,occur=0;
 vector<int>vec;
 cout<<"请输入一个整数n"<<endl;
 cin>>n;
 cout<<"请输入n个整数分别是a1,...an"<<endl;
 for(int i=1;i<=n;i++)
 { cin>>a;
  vec.push_back(a);
 }
 cout<<"请输入一个数m来用于比较"<<endl;
 cin>>m;
 for(vector<int>::iterator iter=vec.begin();iter!=vec.end();iter++)
 {
  if(*iter<m) ++occur;
  //cout<<*iter;
 }
 cout<<occur<<endl;

 return 0;
}

 6.

// 调和级数.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<iomanip>
using namespace std;

float harmony(int n)
{
 double result=0.0;
 for(int i=1;i<=n;++i)
 {
  result+=(double)1/i;
 }
 return result;
}

int _tmain(int argc, _TCHAR* argv[])
{
 int n;
 cout<<"请输入一个整数n:";
 cin>>n;
 cout<<fixed<<setprecision(3)<<harmony(n)<<endl;
 return 0;
}

 7.

// 近似计算.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>

using namespace std;
#define pi 3.14

int _tmain(int argc, _TCHAR* argv[])
{

 double i,result=0.0,a=pi/4;
 for(i=1;1/(2*i-1)>0.000001;++i)
 {
  
  if((int)i%2==0)
  {
   result-=1/(2*i-1);
    
  }
  else
  {
   result+=1/(2*i-1);
  
  }
  
 }
 cout<<"i="<<i<<endl;
 cout<<"real value:"<<endl;
 cout<<"pi/4="<<a<<endl;
 cout<<"appreciate value:"<<endl;
 cout<<"pi/4="<<result;

 return 0;
}

 8.

// 子序列的和.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<iomanip>
using namespace std;

double subsequence(int m,int n)
{
 double i;
 double result=0.0;
 i=m>n?n:m;
 for(;i<=(m>n?m:n);++i)
 {
  result+=1/(i*i);
 }
 return result;
}

int _tmain(int argc, _TCHAR* argv[])
{
 int m,n;
 cout<<"请输入两个整数:";
 cin>>m>>n;
 cout<<"m,n之间的子序列的和为:"<<endl;
 cout<<fixed<<setprecision(5)<<subsequence(m,n);
 return 0;
}

9.

// 分数化小数.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<iomanip>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
 int a,b,c;
 cout<<"请输入三个整数a,b,c:";
 cin>>a>>b>>c;
 cout<<fixed<<setprecision(c)<<(double)a/b<<endl;
 return 0;
}

10.(刚开始不会,后来仔细想一下外加参考了一下网上的代码)

// 排列.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;

int a[9];//定义一个数组来存储三个数中的每个数字

int ok(int t,int *z) ///分解t的值,将其存入z指向的三个数组元素,若满足要求返回1
{
 int *p1,*p2;
 for(p1=z;p1<z+3;p1++)
 {
  *p1=t%10; ///把t分解,得到个位上的数字
  t/=10;//十位上的数字
  for(p2=a;p2<p1;p2++) ///查询分解出的数字是否已经出现过
  if(*p1==0||*p2==*p1)return 0; ///若重复则返回
 }
 return 1; //否则返回满足要求1
}

int main()
{
 int m,count=0;
 for(m=123;m<=333;m++) ///试探可能的三位数(首先要明白三个数当中最小的那个数不可能大于333,并且最小值为123.
       //中间的那个数不可能大于666)
 if(ok(m,a)&&ok(2*m,a+3)&&ok(3*m,a+6))// /若满足题意

 cout<<"No."<<++count<<":"<<m<<" "<<2*m<<" "<<3*m<<endl;
}


/*
第二种方法
int f1(int a)
{
    int b=0;
    while(a)
    {
        int n=a%10;
        a/=10;
        b+=n;
      
    }
    return b;
}

int f2(int a)
{
    int c=1;
  
    while(a)
    {
        int n=a%10;
        a/=10;
        c*=n;
      
    }
    return c;
}
int main()
{
    for(int i=123; i<=987/3; i++)
    {
        if(  f1(i)+f1(2*i)+f1(3*i)==45 && f2(i)*f2(i*2)*f2(i*3)==362880)
            cout << i<<" "<<2*i<<" "<<3*i << endl;
    }
  
    return 0;
}*/

原文地址:https://www.cnblogs.com/ljy2013/p/3268881.html