/*本文为平时练习之作,若有错误还望指出,谢谢。*/
1-1 韩信点兵 (枚举是最直接的解决办法)
法一:
#include<stdio.h>
void main()
{
/*思路:总数减去余数再整除3,5,7 */
int a,b,c,sum;
scanf("%d %d %d",&a,&b,&c);
for(sum=10;sum<=100;sum++)
{
if((sum-a)%3==0)
{
if((sum-b)%5==0)
{
if((sum-c)%7==0)
{
printf("the sum is: %d\n",sum);
break; //输出结果, 跳出循环
}
}
}
}
if(sum > 100)
{
printf("No answer");
}
}
法二:
#include<stdio.h>
int main()
{
int i = 10;
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
while(i < 100)
{if((i%3 == a)&&(i%5 == b)&&(i%7 == c))
{
printf("people : %d\n", i);
return 0;
}
i++;
}
printf("no answer\n");
}
1-2 倒三角形
(解析:外层for循环控制输出的行数(第i行),内层两个for循环分别输出相应行数的空格数目和“#”数目。)
法一:
#include<stdio.h>
void main()
{
/*思路:按照每行共有 2n个格,n为行数,i为递减的变量, 空格的数量每行为 2*i-1,#的数量为n-i。*/
int n,i,j,k;
scanf("%d",&n); //输入n的值
for(i=n;i>0;i--) //因为是倒三角,所以自减
{
for(k=0;k<n-i;k++) //控制空格
{
printf(" ");
}
for(j=0;j<2*i-1;j++) //输出一行上的“#”
{
printf("#");
}
printf("\n");
}
}
法二:
1-3 序列求和
#include<stdio.h>
void main()
{
int n,m;
double result;
result = 0.0;
scanf("%d%d",&n,&m);
if(m<1000000)
{
for(;n<=m;n++)
result +=(1.0/n)*(1.0/n); /*若按原公式步骤会报错*/
printf("The result is: %.5f\n",result);
}
else
printf("Please reenter the data!");
}
1-4 蛇形
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int a[15][15];
int main()
{
int n;
while(~scanf("%d", &n))
{
int i=1, j=n;
int k=n*n, t=1;
memset(a,0,sizeof a);
a[i][j]=t++;
while(t<=k)
{
while(a[i+1][j]==0 && i+1<=n)
a[++i][j]=t++;
while(a[i][j-1]==0 && j-1>=1)
a[i][--j]=t++;
while(a[i-1][j]==0 && i-1>=1)
a[--i][j]=t++;
while(a[i][j+1]==0 && j+1<=n)
a[i][++j]=t++;
}
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
printf("%4d", a[i][j]);
printf("\n");
}
}
return 0;
}
1-5 竖式问题
#include <stdio.h>
#include <string.h>
int main()
{
int abc, de, x, y, z, i, ok, count = 0;
char s[20], buff[100];
scanf("%s", s);
for (abc = 100; abc < 999; abc++)
{
for (de = 10; de < 99; de++)
{
x = abc * (de % 10);
y = abc * (de / 10);
z = abc * de;
sprintf(buff, "%d%d%d%d%d", abc, de, x, y, z);
ok = 1;
for (i = 0; i < strlen(buff); i++)
if (strchr(s, buff[i]) == NULL)
ok = 0;
if (ok)
{
printf("<%d>\n", ++count);
printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n", abc, de, x, y, z);
}
}
}
printf("The number of solutions = %d\n", count);
return 0;
}
1-6 最长回文子串
#include "stdafx.h"#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
string longestPalindrome(string s) {
const int n=s.size();
bool dp[n][n];
fill_n(&dp[0][0],n*n,false);
int max_len=1; //保存最长回文子串长度
int start=0;//保存最长回文子串起点
for(int i=0;i<s.size();++i)
{
for(int j=0;j<=i;++j)
{
if(i-j<2)
dp[j][i]=(s[i]==s[j]);
else
dp[j][i]=(s[i]==s[j] && dp[j+1][i-1]);
if(dp[j][i] && max_len<(i-j+1))
{
max_len=i-j+1;
start=j;
}
}
}
return s.substr(start,max_len);
}
};
int _tmain(int argc, _TCHAR* argv[])
{
string input;
Solution sln;
while(cin>>input)
{
cout<<"最长回文子串为:"<<sln.longestPalindrome(input)<<endl;
}
return 0;
}