程序设计编程小练习

1.科学计数法的值

科学计数法是一种数学专用术语。将一个数表示成 a×10的n次幂的形式,其中1≤|a|<10,n为整数,这种记数方法叫科学计数法。例如920000可以表示为9.2*10^5

现在需要对输入的字符串进行分离,自动识别该科学计数法中的a和幂次,计算其表征的具体数值并输出该值。

例如,对于输入的复数字符串“9.210^5”,输出
The actual value for 9.2
10^5 is 920000

注意:

1、每组测试数据仅包括一个用于科学计数法的字符串。

2、输入字符串保证合法。

3、字符串长度不超过1000

4、幂次不超过200

输入示例:

9.2*10^5

输出示例:

The actual value for 9.2*10^5 is 920000

#include<iostream>
using namespace std;
int main()
{
	char a[1000];
	char b[1000];
	int k,j,n=0;
	cin>>a;
	for(int i=0;;i++)
	{
		if(a[i]=='.') 
		k=i;
		if(a[i]=='^')
		{
		    j=i;
		    i++;
		    while(a[i]!='\0')
		    {
		    	n=n*10+a[i]-48;
		    	i++;
			}
		    break;
		}
	}
	for(int i=0;i<j-2;i++)
	    b[i]=a[i];
	for(int i=j-2;i<1000;i++)
	    b[i]='0';
	for(int i=k;i<n+k;i++)
		b[i]=b[i+1];
		cout<<"The actual value for "<<a<<"is";
	if(k+n<j-3)
	{
		b[n+k]='.';
		for(int i=0;i<j-2;i++)
		cout<<b[i];
	}
	else
	{
		for(int i=0;i<k+n;i++)
		cout<<b[i];
	}
}

不包括幂次为零的情况。

2.狼羊人菜过河经典问题

 以0000表示初始状态,1111表示目标状态 

#include<iostream>
#include<string.h>
using namespace std;
char name[4][8]={"羊","白菜","狼","人"};

struct Node
{
	int key;
	string tag;
	Node*next;
	int visited;
};
class Queue
{public:
	Node*front;
	Node*rear;
	
		Queue()
		{
			front=new Node;
			front->next=NULL;
			rear=front;
		}
		~Queue()
		{
			while(front!=rear)
			{
			    Node*node=front->next;
			    front->next=node->next;
			    delete node;
			    if(rear->next==NULL)
			    rear=front;
			}
		 } 
		void enQueue(Node*n)
		{
			n->next=rear->next;
			rear->next=n;
			rear=rear->next;
		}
		void deQueue1()
		{
			Node*node=front->next;
			front->next=node->next;
			delete node;
			if(front->next==NULL)
			rear=front;			
		}
		Node* deQueue2()
		{
			Node*node=front->next;
			front->next=node->next;
				cout<<node->tag<<":"<<'\n';
			    printf("North Bank\n");
			    for(int j=3;j>=0;j--)
			    printf("%s ",((node->key>>j)&1)?name[j]:" ");
		    	printf("\nSouth Bank\n");
		    	for(int j=3;j>=0;j--)
			    printf("%s ",(!((node->key>>j)&1))?name[j]:" ");
				cout<<'\n';					
			return node;	
		}
		bool Isempty()
		{
		    if(front==rear)
		    return true;
		    else 
		    return false;
		}
		
 };
 void BFS(struct Node**a,Queue q)
 {
    int e[4]={8,9,10,12};
 	struct Node* n=*a;
 	n->tag="Case 1";
 	q.enQueue(n);
	int i=0;
 	while(!q.Isempty())
 	{
 	    if(i)
 	    q.deQueue1();
 		Node* blank=new Node;
 		blank->key=0;
 		q.enQueue(blank);
 		while(q.front->next!=blank)
 		{
 		    Node*m;
			m=q.deQueue2();
 			m->visited=1;
 			if(m->key==15)
 			return;
 			char t='1';
 			for(int i=0;i<4;i++)
 			{
 				if((((m->key&e[i])==e[i])||((15-m->key&e[i])==e[i]))&&!(a[(m->key)^e[i]]->visited))
 				{
 					a[(m->key)^e[i]]->tag=m->tag+"-";
					a[(m->key)^e[i]]->tag+=t;
					a[(m->key)^e[i]]->key=(m->key)^e[i];
				    q.enQueue(a[(m->key)^e[i]]);
				    t++;
				}
			}
		}
		i++;
	}	
 }
int main()
{
	int x;
	cout<<"输入开始状态对应二进制数字"; 
	cin>>x;
	struct Node*state[16];
	Queue q;
	for(int i=0;i<16;i++)
	{
		state[i]=new Node;
		state[i]->key=i;
	switch(i)
	{
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:	
	    	state[i]->visited=1;break;
	    default:
		    state[i]->visited=0;
	}		
	}
	BFS(&state[x],q);
}

 注:此代码通过广度优先搜索实现所有情况列举,若同一层次没有先一后二...枚举说明情况合并。

3.凯撒密码

为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个整数offset,用凯撒密码将其加密后输出。恺撒密码是一种简单的替换加密技术,将明文中的所有字母都在字母表上偏移offset位后被替换成密文,当offset大于零时,表示向后偏移;当offset小于零时,表示向前偏移。

输入格式:

输入第一行给出一个以回车结束的非空字符串(少于80个字符);第二行输入一个整数offset。

输出格式:

输出加密后的结果字符串。

#include <iostream>
int main(int argc, char* argv[])
{   using namespace std;
    int offset,i,l; char str[81];
    cin.getline(str,80,'\n');
    cin>>offset;
	for(i=0;str[i]!=0;i++)
	{   
	    if(str[i]>='A'&&str[i]<='Z'||str[i]>='a'&&str[i]<='z')
        {
         if(str[i]>='A'&&str[i]<='Z')
		 { 
             if (str[i]-'A'+offset>=0) 
			 str[i]=(str[i]-'A'+offset)%26+'A';
             else if((str[i]-'A'+offset)%26!=0)
             str[i]=(str[i]-'A'+offset)%26+'Z'+1;
         }
	     else
	     {
             if (str[i]-'a'+offset>=0) 
			 str[i]=(str[i]-'a'+offset)%26+'a';
             else if((str[i]-'a'+offset)%26!=0)
             str[i]=(str[i]-'a'+offset)%26+'z'+1;
         }
	    }
    }
    for(l=0;l<=i;l++)
    {printf("%c",str[l]);}
	return 0;
}

4.求整数序列中出现次数最多的数

本题要求统计一个整型序列中出现次数最多的整数及其出现次数。

输入格式:

输入在一行中给出序列中整数个数N(0<N≤1000),以及N个整数。数字间以空格分隔。

输出格式:

在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字是唯一的。

输入样例:

10 3 2 -1 5 3 4 3 0 3 2

输出样例:

3 4
#include<iostream>
using namespace std;
int main()
{
    char d;
	int a,k=0,c=0;
	int num[1000];
	int time[1000]={0};
do{
	cin>>a;
	int c=0;
		for(int i=0;i<k;i++)
		{
			if(a==num[i])
			{
			    time[i]++;
			    c++;
			    break;
			}
		}
	if(!c)
	{
		num[k]=a;
		time[k]++;
		k++;
	}
	 d=getchar();
}
while(d!='\n');
	int max=time[0];
	int p=0;
	for(int i=1;i<k;i++)
	{
		if(time[i]>max)
		{
			max=time[i];
			p=i;
		}
	}
	cout<<num[p]<<" "<<max;	
}

5. 螺旋方阵

所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。

输入格式:

输入在一行中给出一个正整数N(<=30)。

输出格式:

输出N×N的螺旋方阵。每行N个数字,每个数字占3位。

输入样例:

5

输出样例:

001 002 003 004 005
016 017 018 019 006
015 024 025 020 007
014 023 022 021 008
013 012 011 010 009

输入样例:

10

输出样例:

001 002 003 004 005 006 007 008 009 010
036 037 038 039 040 041 042 043 044 011
035 064 065 066 067 068 069 070 045 012
034 063 084 085 086 087 088 071 046 013
033 062 083 096 097 098 089 072 047 014
032 061 082 095 100 099 090 073 048 015
031 060 081 094 093 092 091 074 049 016
030 059 080 079 078 077 076 075 050 017
029 058 057 056 055 054 053 052 051 018
028 027 026 025 024 023 022 021 020 019
#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std;
int main(){
	int N;
	cin>>N;int i=1;
    int k=0,j=0,a[N][N],m,M=0;
	for(i;N>=(N+M+1)/2;N--)
	{ 
	    for(i;j<N&&i<=(N+M)*(N+M);i++)
	    {
		    a[k][j]=i;j++;
		}
		j--;k++;
	    for(i;k<N&&i<=(N+M)*(N+M);i++)
	    {
		    a[k][j]=i; 
			k++;
		}
		k--;j--;
		for(i;j>=M&&i<=(N+M)*(N+M);i++)
	    {    
		    a[k][j]=i;
			j--;
		}
		j++;k--;
		for(i;k>=M+1&&i<=(N+M)*(N+M);i++)
	    {
		    a[k][j]=i;
			k--; 
		}
		k++;j++;
	M++;
	}
	i--;
	N=sqrt(i);
	for(k=0;k<N;k++)
    {j=0;
    	for(j=0;j<N;j++)
    	{
		    if(j!=N-1) 
		    cout<<setw(3)<<setfill('0')<<a[k][j]<<" ";
		    else
		    cout<<setw(3)<<setfill('0')<<a[k][j];
		}
		cout<<'\n';
	}
   return 0;
} 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值