DHU OJ

11丑数(枚举)

 12笨小猴(字符串)

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
//素数判断函数 是返回1 不是返回0
int is_zhishu(int x)
{
	for(int i=2;i<=x/2;i++)
		if(x%i==0)
            return 0;
	return 1;
}
int main()
{
	char a[101],b[26]={};//b数组初始化为0
	cin>>a;
	int len=strlen(a);	//输入单词长度
	for(int i=0;i<len;i++)	//遍历
	{
		 b[a[i]-95]++; //a对应0 z对应25  对应位置++ ,将字母转换成整数类型‘a’对应acsii码95
	}
	int max=-1,min=101;	//初始化最大最小值
	for(int i=0;i<26;i++)//遍历b数组
	{
		if(b[i]>max)
            max=b[i]; //最大值
		if(b[i]!=0 &&b[i]<min)
            min=b[i];//0除外的最小值
	}

	if( is_zhishu(max-min) &&(max-min)>1 ) //0跟1不是素数 也要输出 No Answer
		cout<<"Lucky Word"<<endl<<max-min;

    else
        cout<<"No Answer"<<endl<<"0";
}

 13子串统计(字符串)

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
	int L,maxn,cnt;
	string s,s1,s2,ans;
	int len;
	while(scanf("%d",&L)!=EOF)
	{
		cin>>s;//输入字符串S
		len=s.length(); //字符长度len
		maxn=cnt=0;//
		for(int i=L;i<=len;i++)
            //开展暴力循环 ,依次统计长度为L,L+1,L+2到len的子串
		{
			for(int j=0;j+i<=len;j++)//每次增加一个字符
			{
				cnt=0;
				//统计字符串出现次数,每次置零
				s1=s.substr(j,i);
               //字符串截取函数,两个参数,截取str里面从j开始之后的字符长度为i的字符串
				for(int k=0;k+i<=len;k++)
				{
					s2=s.substr(k,i);//每次往后走一个
					if(s1==s2)
					{
						cnt++;
					}
				}//此循环统计长度为i的字符串出现次数
				if(cnt>maxn)
                    //更新出现最多的次数和对应的子串
				{
					ans=s1;
					maxn=cnt;
				}
				else if(cnt==maxn&&s1.length()>ans.length())
				//出现次数相同,ans取长度最长的
				{
					ans=s1;
				}
				//该程序取子串是从头开始的,因此当出现次数相同时,而且长度也相同,保存的就是第一次出现的字串
			}
		}
		cout<<ans<<endl;
		//ans 是出现次数最多的子串,maxn 是该子串出现的次数
	}
    return 0;
}

 14Anagrams问题(字符串)

#include<bits/stdc++.h>

using namespace std;

int a[26],b[26];
//两个数组对应记录每个字符串字母出现的频次
int main() {
	string s1,s2;//存储两个字符串
	int i;
	cin >> s1 >> s2;
	if (s1.length() != s2.length()){
		cout << "N";
		return 0;
	}//两个字符串长度不同时,必然不是
	int len = s1.length();
	//当两个字符串长度相同时
	for (i = 0; i < len; i ++) {
		if(s1[i] <= 90 && s1[i] >= 65) {//判断大小写
			a[s1[i] - 65] ++;
			//当字符为大写时‘A’-‘Z’-->65--90
		}
		else{
			a[s1[i] - 97] ++;//当字符为小写时'a'--97
		}
		if(s2[i] <= 90 && s2[i] >= 65) {
			b[s2[i] - 65] ++;
		}
		else{
			b[s2[i] - 97] ++;
		}
	}
	bool flag = true;
	for (i = 0; i < 26; i ++) {
		if (a[i] != b[i]){
			flag = false;
			break;
		}
		else
            continue;
	}
	if (flag == true) {
		cout << "Y";
	}
	else{
		cout << "N";
	}
	return 0;
}
*/

//15身份证号码升级(字符串)
/*
#include<string>
#include<stdio.h>
#include<iostream>
using namespace std;

int alpha[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
//对应系数表
char code[] = { '1','0', 'x','9', '8', '7', '6', '5', '4', '3', '2' };
//取余之后的对应表格
string str;
//int ctoi(char c)
//{
//	return c - '0';
//}//将字符字母转化成整数类型
int main()
{
	cin >> str;
	int sum = 0;
	for (int i = 0;i < 6;++i)
	{
		sum += ((str[i]-'0')*alpha[i]) % 11;
		//在每次循环时就开始取余
		printf("%c", str[i]);
	}
	//第七第八个数直接输出19
	sum += (alpha[6] + 9 * alpha[7]) % 11;
	printf("19");
	//原数组继续做处理
	for (int i = 6;i<15;++i)
	{
		sum += ((str[i]-'0') * alpha[i + 2]) % 11;
		printf("%c", str[i]);
	}
	printf("%c\n", code[sum % 11]);//输出最后一个数
	return 0;
}

 16彩票(数组)

#include <iostream>
using namespace std;
int book[100],n,prize[8];
//book里放所有的号码  prize里放(0-6)等奖的个数
int main()
{
    cin>>n;
    int i,j,t,count1;
    for(i=1;i<=7;i++)
    {
        //循环输入获奖的号码,在对应位置上标志为1
        cin>>t;
        book[t]=1;
      //如果这个数是中奖号码 则标志为1
    }
    for(i=1;i<=n;i++) //循环n张彩票
    {
        count1=0;
	  for(j=1;j<=7;j++)//输入每次的7个号码
	   {
	       cin>>t;
	     if(book[t]) //如果这个数是中奖号码
	     count1++; //中奖号码数+1
	   }
	   //一张彩票判断完成之后在对应奖项处加一
       prize[7-count1]++; //对应的几等奖+1
    }
    for(i=0;i<7;i++)//循环输出每个奖项的获奖情况
     printf("%d ",prize[i]);
	return 0;
}

 17质数的后代(数组)

#include<iostream>
#include<cmath>
using namespace std;
bool justss(int x)
//判断素数
{
	for (int i = 2; i <= sqrt(x); i++)
		if (x % i == 0)
			return false;
	return true;
}
bool justhd(int x)
//判断质数的后代
{
	int j;
	for (int i = 2; i <= sqrt(x); i++)
	{
		if (justss(i) == true)
		{
			if (x%i == 0)
			{
				j = x / i;
				//i,j为这个数的两个因子
				if (justss(j) == true)
					return true;
			}
		}
	}
	return false;
}
int main()
{
	int n,x;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> x;
		if (justhd(x) == true)
			cout << "Yes" << endl;
		else
			cout << "No" << endl;
	}
    return 0;
}

 18高精度乘法(数组)

#include <iostream>
#include <cstring>
using namespace std;
#define max 1000000
char a[max],b[max];
int A[max],B[max],C[2*max],temp,lena,lenb,lenc;
bool flag1=true,flag2=true;
int main(){
	cin>>a;
	cin>>b;
	lena=strlen(a);
	lenb=strlen(b);
	lenc=lena+lenb;
	for(int i=0;i<lena;++i)
	A[i]=a[lena-1-i]-'0';
	//倒置存储
	for(int i=0;i<lenb;++i)
	B[i]=b[lenb-1-i]-'0';
	for(int i=0;i<lena;++i)
		{
			temp=0;
			for(int j=0;j<lenb;++j)
			{
				C[i+j]=A[i]*B[j]+temp+C[i+j];
				temp=C[i+j]/10;
				C[i+j]%=10;
			}
			C[i+lenb]=temp;
		}
	for(int i=lenc-1;i>=0;--i)
	{
		if(C[i]==0&&lenc>1)
		{
			lenc--;
		}
		else {
			break;
		}
	}
	for (int i=lenc-1; i>=0; i--)
	{
    	cout<<C[i];
    }
    return 0;
}

 19阶乘末尾(数组)

#include <iostream>
using namespace std;

#define MAX_N 61

int main() {
    int a[MAX_N] = {1};//初始化a[0]为1
    int n,len,i;
    cin>>n>>len;
    for(;n>1;--n) {
        for(i=0;i<MAX_N;++i) {
            a[i] *= n;
        }//求阶乘
        for(i=0;i<MAX_N-1;++i) {
            //相当于逆置放入了数组
            a[i+1] += (a[i]/10);
            //发生进位时,放进a数组的下一位,相当于逆置了
            a[i] = a[i]%10;
            //将余数放入a[i]里
        }
    }
    for(i=len-1;i>=0;--i) {
        cout<<a[i];
    }
    return 0;
}

 20寂寞的数(数组)

#include<cstdio>
using namespace std;
#define MAXN 10010
int alone[MAXN];
int main()
{
    int N;
    int k;
    int sum;
    scanf("%d", &N);
    for(int i = 1; i <= N; ++i)
    {
        k = i;
        sum = i;
        while(k)//求该数各个位的和
        {
            sum += k % 10;
            k /= 10;
        }
        alone[sum] = 1;
        //如果N以内的某个数不是寂寞数,则标记为1
    }
    for(int i = 1; i < N; ++i){
        if(alone[i] == 0)
          printf("%d\n", i);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值