暴力求解法
知识点:
要求设计者找出所有可能的方法,然后选择其中的一种方法,若该方法不可行则试探下一种可能的方法。
使用暴力法的几种情况
1.搜索所有的解空间
2.搜索所有的路径
3.直接计算
4.模拟和仿真
实例
代码如下:
#include <stdlib.h>
int test(int i,int j){
int a[11];
int k=0;
while(i!=0)
{
a[k++]=i%10;
i/=10;
}
while(j!=0) {
a[k++]=j%10;
j/=10;
}
int flag;
if(k==9)flag=0;
int l;
for(k=0;k<10;k++){
for(l=k+1;l<10;l++){
if(!flag){
if(a[k]==a[l]||a[k]==0) return 0;}
else if(flag){
if(a[k]==a[l]) return 0;}
}
}
return 1;
}
int main(int argc, char *argv[]) {
int i,n,m;
scanf("%d",&n);
for(i=1234;i<98765;i++)
{
m=i*n;
if(m>100000) break;
printf("%d/%05d=%d\n",m,i,n);
}
}
return 0;
}
long long存储。
代码如下:
#include<stdio.h>
int main(){
int i,j,n;
int s[18];
while(scanf("%d",&n)==1&&n){
for(int i=0;i<n;i++)
scanf("%d",&s[i]);
int result[172],count=0;//用来存各连续子序列的值
for(int i=0;i<n;i++){//计算子序列的值
result[count++]=s[i];
for(int j=i+1;j<n;j++){
count ++;
result[count]=result[count-1]*s[i];}
count++;}
int mid=result[0];//找子序列中最大的与结果集比较;
for(i=1;i<count;i++)
mid=(mid>result[i]?mid:result[i];
if(mid>0)
printf("-1\n");
}
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
char s[20];
int i;
while(scanf("%d",&s[i])){
int length=strlen(s);
int ans=0;
for( i=length-1;i>=0;i-=2){
ans+=s[i]-'0';
}
for( i=length-2;i>=0;i-=2){
int num=(s[i]-'0')*2;
if(num>=10)
num-=9;
ans+=num;
}
if(ans%10==0){
printf("成功");
}
else printf("失败");
}
return 0;
}
之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,当时的宗教禁止在数字中出现0的概念!
罗马数字的表示主要依赖以下几个基本符号:
I --> 1
V --> 5
X --> 10
L --> 50
C --> 100
D --> 500
M --> 1000
这里,我们只介绍一下1000以内的数字的表示法。
单个符号重复多少次,就表示多少倍。最多重复3次。
比如:CCC表示300 XX表示20,但150并不用LLL表示,这个规则仅适用于I X C M。
如果相邻级别的大单位在右,小单位在左,表示大单位中扣除小单位。
比如:IX表示9 IV表示4 XL表示40
49 = XLIX
更多的示例参见下表,你找到规律了吗?
I = 1
II = 2
III = 3
IV = 4
V = 5
VI = 6
VII = 7
VIII = 8
IX = 9
X = 10
XI = 11
XII = 12
XIII = 13
XIV = 14
XV = 15
XVI = 16
XVII = 17
XVIII = 18
XIX = 19
XX = 20
XXI = 21
XXII = 22
XXIX = 29
XXX = 30
XXXIV = 34
XXXV = 35
XXXIX = 39
XL = 40
L = 50
LI = 51
LV = 55
LX = 60
LXV = 65
LXXX = 80
XC = 90
XCIII = 93
XCV = 95
XCVIII = 98
XCIX = 99
C = 100
CC = 200
CCC = 300
CD = 400
D = 500
DC = 600
DCC = 700
DCCC = 800
CM = 900
CMXCIX = 999
本题目的要求是:请编写程序,由用户输入若干个罗马数字串,程序输出对应的十进制表示。
输入格式是:第一行是整数n,表示接下来有n个罗马数字(n<100)。
以后每行一个罗马数字。罗马数字大小不超过999。
要求程序输出n行,就是罗马数字对应的十进制数据。
例如,用户输入:
3
LXXX
XCIII
DCCII
代码如下:
#include<stdio.h>
#include<sring.h>
struct luoma {
char name;
int num;
}
struct luoma a[7]{{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000}};
void change(char b[k],int num){
int i,j,sum;
struct luoma c[10];
for(int i=0;i<num;i++){
for(j=0;j<7;j++){
if(b[i]==a[i].name){
c[i].name=b[i];//存放当前单个罗马数字及其值
c[i].n=a[j].n;
}
}
}
sum=c[i-1].n;
for(i=num-1;i>0;i--){
if(c[i].n<=c[i-1].n){
sum=sum+c[i-1].n;}
else
sum=sum-c[i-1].n;
}
printf("%d",sum);
}
int main(){
int N,k;
scanf("%d",&N);
char b[10][10];//只能存放十组罗马数字 一组罗马数字只能有10个字符;
int num[10],i,j,sum;
for(k=0;k<N;k++){
scanf("%s",b[k]);//输入几组罗马数字
num[k]=strlen(b[k]);}//一组罗马数字的长度
for(k=0;k<N;k++){
change(b[k],num[k]);
}
return 0;
}