1040 排序
题意:给你一些整数,你的任务是对这些数字进行排序。
解析:快速排序
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
void main()
{
int n, T, t;
int arr[1000];
cin >> T;
while (T--)
{
cin >> n;
for (int i = 0; i<n; i++)
cin >> arr[i];
for (int i = 0; i<n; i++)
{
for (int j = i + 1; j<n; j++)
{
if (arr[i]>arr[j])
{
t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
}
cout << arr[0];
for (int i = 1; i<n; i++)
cout << " " << arr[i];
cout << endl;
}
system("pause");
}
1041 函数题
题意:初始为1,然后1变为01,再然后0变为10,1变为01...求经过n次变换,相邻两个0的个数
解析:分析00的产生必然由n-1组的01产生,即00的个数等于n-1组01的个数。
n-1组01的产生有两个来源。
1).由n-2组的1
2).由n-2组的00变幻1010,
则可以求得f(n)=f(n-2)+2^(n-3)
#include<iostream>
#include<cstring>
using namespace std;
int dp[1002][500];
int p[500];
int main(){
int n,i,j,z,t;
memset(p,0,sizeof(p));
memset(dp,0,sizeof(dp));
dp[1][1]=0;
dp[2][1]=1;
dp[3][1]=1;
p[1]=1;
for(i=4;i<1001;i++)
{
for(j=1;j<500;j++)
p[j]=p[j]*2;
z=0;
for(j=1;j<500;j++)
{
t=p[j]+z;
z=t/10;
p[j]=t%10;
}
for(j=1;j<500;j++)
dp[i][j]=dp[i-2][j]+p[j];
z=0;
for(j=1;j<500;j++)
{
t=dp[i][j]+z;
z=t/10;
dp[i][j]=t%10;
}
}
while(cin>>n)
{
i=499;
while(dp[n][i]==0) i--;
for(;i>=1;i--)
printf("%d",dp[n][i]);
if(n!=1)
printf("\n");
else
printf("0\n");
}
return 0;
}
1042 n!
解析:循环一个数一个数相乘,每次都用数组分别存结果的每一位,最后从大到小按位输出。sum为后一位的进位。
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
if(n==0 || n==1)
cout<<1<<endl;
else
{
int a[10000]={0},i,j,sum,t,k,q;
a[0]=1;
k=1;
for(i=2;i<=n;i++)
{
sum=0;
for(j=0;j<k;j++)
{
t=a[j]*i+sum;
a[j]=t%10;
sum=t/10;
}
while(sum)
{
a[k++]=sum%10;
sum/=10;
}
}
for(q=k-1;q>=0;q--)
cout<<a[q];
cout<<endl;
}
}
return 0;
}