程序设计大题:
求一个正整数各个位置数字之和。
例如:
输入:126
输出:9(1+2+6)
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int sum=0;
while(n!=0)
{
sum+=n%10;
n=n/10;
}
cout<<sum<<endl;
}
用1*2的骨牌铺满2*n的方格,问:有几种铺法。已知n=1时,有1种铺法,n=2时,有2种铺法。
例如:
输入:4
输出:5
分析:设2为宽,n为长,铺法数为f(n),n>2时有:
左边数第一个骨牌如果是竖着放的,那么剩余长为n-1,故有f(n-1)种铺法
左边数第一个骨牌如果是横着放的,那么毋庸置疑它下方的骨牌也一定是横着的同理知有f(n-2)种铺法
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int a[n];
a[0]=1;
a[1]=2;
for(int i=2;i<n;i++)
a[i]=a[i-1]+a[i-2];
cout<<a[n-1]<<endl;
}
先输入数字n,然后给定n个数,求这n个数所能组成的最大数。
例如:
输入:3
32 120 9
输出:932120
题目提示很明显,此题数应定义为string类型。
分析:
显然,首位数字越大的数字应当放在越前面,恰巧string类型的数据排序是按照首位的ASCII排序的,与位数无关,完全满足题意。
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int n;
cin>>n;
string a[n];
string sum="";
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n-1;i++) //将数字按首位从大到小冒泡排序
for(int j=i+1;j<n;j++)
{
string t;
if(a[i]<a[j])
{t=a[i];
a[i]=a[j];
a[j]=t;}
}
for(int i=0;i<n;i++)
{
sum=sum+""+a[i];
}
cout<<sum<<endl;
}
求n个数字的最大子段和
此题我是用的暴力求解,三次循环。
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int n;
cin>>n;
int a[n];
int maxx=0;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=1;i<n;i++)
for(int j=0;j<i;j++)
{int sum=0;
for(int l=i;l>=j;l--)
{
sum=sum+a[l];
if(sum>maxx) maxx=sum;
}
}
cout<<maxx<<endl;
}
以上就是本次算法期末考试的全部程序设计题目,考试时第二题没有想出,十分遗憾。这么简单的题都想不明白,说明自身能力还是有所欠缺,思想和思路上不足还很多,有待进步。