打表,大水,RE 3次WA 1次。。。我原来堕落到这么水的程度了。。。囧~
虽然说在discuss里看到有10001的数据,但终究是数组开小了,而且循环条件没处理好。
开始想这么打表会不会太耗时效率太低?。。。结果0ms瞎了我的眼 = =
想个筛数法还回忆了好一阵,我勒个去!
#include<cstdio>
const int MAX = 10050;
int number[10050] = {1,1,0};
int prime_list[2000];
int ans[MAX];
int main()
{
int i,j,k,sum = 0;
for(i = 2;i < 105;i ++)
if(number[i] == 0)
for(j = i * i;j < 10030;j += i)number[j] = 1;
for(i = 2,k = 0;i < 10030;i ++)
if(number[i] == 0){prime_list[k] = i;k ++;} //prime number list
for(i = 0;prime_list[i] < 10030 && prime_list[i] > 0;i ++){ //here forget the rest 0 are also below 10030 = =
for(j = i;sum < 10030;j ++){
ans[sum] ++;
sum += prime_list[j];
}
sum = 0;
}
while(scanf("%d",&i) && i)
printf("%d\n",ans[i]);
return 0;
}
2012年2月4日星期六
2012年1月26日星期四
assembly language 实验九中的问题
在屏幕中间分别显示三种颜色的字符串“welcome to MASM”
80 * 25的彩色字符显示缓冲区
代码:
data segment
db 'welcome to MASM!'
db 02h,01h,04h
data ends
stack segment
dw 8 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,10h
mov bx,[11*160]
mov di,0
mov ax,0b800h
mov cx,3 ;outer loop
s1: push cx
push ax
push di
mov es,ax
mov si,0
mov di,0
mov cx,16
s2: mov al,ds:[di]
mov es:[bx+si],al
inc di
add si,2
loop s2 ;set the even byte in display memory
mov si,1 ;odd byte
pop di ;set color
mov al,ds:[16+di] ;load color
mov cx,16
s3: mov es:[bx+si],al
add si,2
loop s3
;ready for next turn
inc di ;next color style
pop ax
add ax,0ah
;add bx,160 ;next row
pop cx
loop s1
mov ah,4ch
int 21h
code ends
end start
这个是显示正常的,通过修改ax来改段地址(绿色字体),已达到指向下一行的目的。但是,我原先的想法是通过改变bx的值来指向下一行(红色字体),不知何故没有显示正常。。。囧
但是理论上应该是一样的啊??bx自增160到下一行的行首,和ax自增16效果应该是一样的啊。。。这里面有什么玄机?debug了好久也没找出来,菜了。。。。囧
80 * 25的彩色字符显示缓冲区
代码:
data segment
db 'welcome to MASM!'
db 02h,01h,04h
data ends
stack segment
dw 8 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,10h
mov bx,[11*160]
mov di,0
mov ax,0b800h
mov cx,3 ;outer loop
s1: push cx
push ax
push di
mov es,ax
mov si,0
mov di,0
mov cx,16
s2: mov al,ds:[di]
mov es:[bx+si],al
inc di
add si,2
loop s2 ;set the even byte in display memory
mov si,1 ;odd byte
pop di ;set color
mov al,ds:[16+di] ;load color
mov cx,16
s3: mov es:[bx+si],al
add si,2
loop s3
;ready for next turn
inc di ;next color style
pop ax
add ax,0ah
;add bx,160 ;next row
pop cx
loop s1
mov ah,4ch
int 21h
code ends
end start
这个是显示正常的,通过修改ax来改段地址(绿色字体),已达到指向下一行的目的。但是,我原先的想法是通过改变bx的值来指向下一行(红色字体),不知何故没有显示正常。。。囧
但是理论上应该是一样的啊??bx自增160到下一行的行首,和ax自增16效果应该是一样的啊。。。这里面有什么玄机?debug了好久也没找出来,菜了。。。。囧
2012年1月24日星期二
POJ 1750 Dictionary 模拟水题
这题目最后说的blank line number着实让人摸不着头脑,也就不管了。。。算法也没什么太多可以说的,就是做完之后发现这runtime 700+ms... = =!
网上有影射的code,发觉效率真的高不少啊,其实就是将for输出的blank用影射实现了,确实节省一定的时间。。。细节问题呢~总是想不到这种取巧的方法,是coding太少,还没有这意识吧...囧
#include<cstdio>
const int N = 100001,M = 11;
char list[N][M];
int main()
{
int i = 0,j = 0,total = 0;
while(scanf("%s",list[total]) != EOF)
total ++;
int blank = 0,substr = 0;
printf("%s\n",list[0]);
for(i = 1;i < total;i ++){
j = substr = 0;
while(list[i][j] != '\0'){ //control the space number whitout "0",TLE for this T_T
if(list[i][j] != list [i - 1][j])break;
else substr ++;
j ++;
}
if(substr > blank)blank ++; //main algorithm
else blank = substr;
for(int k = 0;k < blank;k ++)
printf(" ");
printf("%s\n",list[i]);
}
return 0;
}
网上有影射的code,发觉效率真的高不少啊,其实就是将for输出的blank用影射实现了,确实节省一定的时间。。。细节问题呢~总是想不到这种取巧的方法,是coding太少,还没有这意识吧...囧
#include<cstdio>
const int N = 100001,M = 11;
char list[N][M];
int main()
{
int i = 0,j = 0,total = 0;
while(scanf("%s",list[total]) != EOF)
total ++;
int blank = 0,substr = 0;
printf("%s\n",list[0]);
for(i = 1;i < total;i ++){
j = substr = 0;
while(list[i][j] != '\0'){ //control the space number whitout "0",TLE for this T_T
if(list[i][j] != list [i - 1][j])break;
else substr ++;
j ++;
}
if(substr > blank)blank ++; //main algorithm
else blank = substr;
for(int k = 0;k < blank;k ++)
printf(" ");
printf("%s\n",list[i]);
}
return 0;
}
订阅:
博文 (Atom)

