banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows giúp e bài tập c này với  XML
  [Programming]   giúp e bài tập c này với 19/03/2009 12:23:36 (+0700) | #1 | 173761
anglezerohacker
Member

[Minus]    0    [Plus]
Joined: 06/10/2008 18:47:54
Messages: 6
Offline
[Profile] [PM] [Email]
hãy đếm số lượng chữ số lớn nhất của số nguyên dương n
[Up] [Print Copy]
  [Question]   Re: giúp e bài tập c này với 19/03/2009 14:20:26 (+0700) | #2 | 173776
[Avatar]
Z0rr0
Q+WRtaW5pc3RyYXRvc+g

Joined: 14/08/2002 12:52:01
Messages: 1323
Location: Underground
Offline
[Profile] [PM] [WWW] [Yahoo!]
Vài gợi ý:
- Duyệt từng chữ số trong số n, bằng cách duyệt từ cuối về đầu, ở mỗi bước chia modulo số n cho 10 để lấy phần dư. Số dư này chính là chữ số sẽ dùng để so sánh
- Lưu giá trị số dư ở trên để so sánh tìm ra giá trị lớn nhất và đếm
- Bước tiếp theo là lấy phần nguyên bằng cách chia divide n cho 10 để lấy phần nguyên
- Lặp lại bước đầu

Tôi gợi ý vậy có khó hiểu ko ta?! smilie
Hibernating
[Up] [Print Copy]
  [Question]   Re: giúp e bài tập c này với 19/03/2009 23:26:38 (+0700) | #3 | 173801
[Avatar]
anglezero
Member

[Minus]    0    [Plus]
Joined: 19/03/2009 11:07:24
Messages: 19
Offline
[Profile] [PM]

Z0rr0 wrote:
Vài gợi ý:
- Duyệt từng chữ số trong số n, bằng cách duyệt từ cuối về đầu, ở mỗi bước chia modulo số n cho 10 để lấy phần dư. Số dư này chính là chữ số sẽ dùng để so sánh
- Lưu giá trị số dư ở trên để so sánh tìm ra giá trị lớn nhất và đếm
- Bước tiếp theo là lấy phần nguyên bằng cách chia divide n cho 10 để lấy phần nguyên
- Lặp lại bước đầu

Tôi gợi ý vậy có khó hiểu ko ta?! smilie 

#include<stdio.h>
#include<conio.h>

void main(void)
{
int idem=1,n,dv,lc,ktra;
printf("Ban nhap n = ");
scanf("%d",&n);
lc=n%10;
ktra=n;
while(n!=0)
{
dv=n%10;
if(dv>=lc)
lc=dv;
n=n/10;
}
while(ktra!=0)
{
n=n%10;
if(lc==n)
idem++;
ktra=ktra/10;
}
printf("Ket qua %d",idem);
getch();
}
anh ZOroro kiem tra dùm em với
e không biết nó bi sai chỗ nào nữa
chạy mà kết quả nó cứ ra 1
[Up] [Print Copy]
  [Question]   Re: giúp e bài tập c này với 20/03/2009 00:33:16 (+0700) | #4 | 173810
[Avatar]
Z0rr0
Q+WRtaW5pc3RyYXRvc+g

Joined: 14/08/2002 12:52:01
Messages: 1323
Location: Underground
Offline
[Profile] [PM] [WWW] [Yahoo!]
Bạn chú ý đặt lại tiêu đề gần với nội dung câu hỏi.

Đoạn
Code:
if(dv>=lc)
lc=dv;

Chỉ cần so sánh lớn hơn là đủ.

Vòng lặp thứ 2 có vấn đề nhầm lẫn khi sử dụng biến smilie

Bài toán này có thể gom lại 1 vòng lặp là đủ.

Hibernating
[Up] [Print Copy]
  [Question]   Re: giúp e bài tập c này với 20/03/2009 11:15:11 (+0700) | #5 | 173882
[Avatar]
anglezero
Member

[Minus]    0    [Plus]
Joined: 19/03/2009 11:07:24
Messages: 19
Offline
[Profile] [PM]

Z0rr0 wrote:
Bạn chú ý đặt lại tiêu đề gần với nội dung câu hỏi.

Đoạn
Code:
if(dv>=lc)
lc=dv;

Chỉ cần so sánh lớn hơn là đủ.

Vòng lặp thứ 2 có vấn đề nhầm lẫn khi sử dụng biến smilie

Bài toán này có thể gom lại 1 vòng lặp là đủ.

 
chỉ e làm bằng 1 vòng lặp với
dùng 2 vòng lặp e làm được rồi
cảm ơn anh!
[Up] [Print Copy]
  [Question]   Re: giúp e bài tập c này với 20/03/2009 12:40:19 (+0700) | #6 | 173887
VaT
Member

[Minus]    0    [Plus]
Joined: 04/09/2008 00:17:52
Messages: 87
Offline
[Profile] [PM]
Một vòng lặp. Bạn đọc kĩ để hiểu giải thuật nhé.

Code:
#include "stdafx.h"
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int _tmain(int argc, _TCHAR* argv[])
{
	int NumId[10]={0,0,0,0,0,0,0,0,0,0};
	double CurNum=0;
	int MaxNum,TempNum;
	MaxNum = 0; TempNum = 0;
	cout << "Nhap vao mot so: ";
	cin >> CurNum;
	while (CurNum!=0)
	{
		TempNum = (int)CurNum % 10;
		if (MaxNum <= TempNum) MaxNum = TempNum;
		NumId[TempNum]++;
		CurNum = (CurNum-TempNum)/10;
	}
	cout << "So Max : "<< MaxNum << endl <<"So luong:"<<NumId[MaxNum]<< endl;

	return 0;
}
[Up] [Print Copy]
  [Question]   giúp e bài tập c này với 20/03/2009 13:22:59 (+0700) | #7 | 173889
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]
@anglezero: Đưa đoạn mã vào [ code ] tag cho dễ đọc: /hvaonline/posts/list/23321.html

anglezerohacker wrote:
hãy đếm số lượng chữ số lớn nhất của số nguyên dương n
 

Ban đầu đọc câu hỏi này mình không hiểu. Mình cứ diễn giải theo ý là: một số nguyên dương có bao nhiêu chữ số thì nó rành rành ra đấy rồi, không hiểu cái "số lượng chữ số" lớn nhất là thế nào? Hì hì.

Đọc xuống dưới mới vỡ ra rằng hóa ra câu hỏi trên được hiểu là: "Cho số nguyên dương n. Hãy đếm xem n có bao nhiêu chữ số lớn nhất?"

@VaT: Mình nghĩ thay NumId=DigitId, MaxNum=MaxDigit, TempNum= LastDigit có khi hay hơn ấy nhỉ. Bạn nghĩ sao?

Let's build on a great foundation!
[Up] [Print Copy]
  [Question]   giúp e bài tập c này với 20/03/2009 14:08:29 (+0700) | #8 | 173894
VaT
Member

[Minus]    0    [Plus]
Joined: 04/09/2008 00:17:52
Messages: 87
Offline
[Profile] [PM]
Bác quanta hiểu sai rồi :
Không phải là
"Cho số nguyên dương n. Hãy đếm xem n có bao nhiêu chữ số lớn nhất?" 


Mà phải là
"Cho số nguyên dương n. Chữ số nào trong số n xuất hiện nhiều nhất và bao nhiêu lần" 


quanta wrote:


@VaT: Mình nghĩ thay NumId=DigitId, MaxNum=MaxDigit, TempNum= LastDigit có khi hay hơn ấy nhỉ. Bạn nghĩ sao?

 


Ừ. Mình cũng thấy vậy. Do code nhanh nên không có tô vẽ nhiều smilie .
[Up] [Print Copy]
  [Question]   Re: giúp e bài tập c này với 20/03/2009 22:25:17 (+0700) | #9 | 173908
[Avatar]
anglezero
Member

[Minus]    0    [Plus]
Joined: 19/03/2009 11:07:24
Messages: 19
Offline
[Profile] [PM]
em mới học c nen chỉ biết viết bằng 2 vòng lặp
viết 1 vòng lặp như mấy a khó quá
e xem không hiểu j hết
vì trình độ e chưa đủ khả năng để hiểu
e cảm ơn mấy anh!
[Up] [Print Copy]
  [Question]   giúp e bài tập c này với 21/03/2009 00:13:07 (+0700) | #10 | 173924
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]

VaT wrote:
Bác quanta hiểu sai rồi :
Không phải là
"Cho số nguyên dương n. Hãy đếm xem n có bao nhiêu chữ số lớn nhất?" 


Mà phải là
"Cho số nguyên dương n. Chữ số nào trong số n xuất hiện nhiều nhất và bao nhiêu lần" 

 

Edited: Ơ, hình như bạn nhầm. Lời giải thích này không đúng cho đoạn code trên của bạn.

@anglezero: Bạn không hiểu chỗ nào?
Let's build on a great foundation!
[Up] [Print Copy]
  [Question]   Re: giúp e bài tập c này với 21/03/2009 01:42:12 (+0700) | #11 | 173945
FaL
Moderator

Joined: 14/04/2006 09:31:18
Messages: 1232
Offline
[Profile] [PM]
@VaT:
Thay NumId[] bằng 1 biến count, sau mỗi lần thay đổi MaxNum khởi tạo lại count = 1 cũng được.
CurNum ko nhất thiết khai báo double. Khai báo int thì trong phép chia cho 10 C sẽ tự động ép kiểu cho bồ.

PS: Đọc tới chỗ bồ VaT giải thích tui mới hiểu đề bài smilie
Hãy giữ một trái tim nóng và một cái đầu lạnh
[Up] [Print Copy]
  [Question]   Re: giúp e bài tập c này với 21/03/2009 02:11:47 (+0700) | #12 | 173949
choc_
Member

[Minus]    0    [Plus]
Joined: 27/01/2009 06:46:01
Messages: 122
Offline
[Profile] [PM]

VaT wrote:
Một vòng lặp. Bạn đọc kĩ để hiểu giải thuật nhé.

Code:
#include "stdafx.h"
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int _tmain(int argc, _TCHAR* argv[])
{
	int NumId[10]={0,0,0,0,0,0,0,0,0,0};
	double CurNum=0;
	int MaxNum,TempNum;
	MaxNum = 0; TempNum = 0;
	cout << "Nhap vao mot so: ";
	cin >> CurNum;
	while (CurNum!=0)
	{
		TempNum = (int)CurNum % 10;
		if (MaxNum <= TempNum) MaxNum = TempNum;
		NumId[TempNum]++;
		CurNum = (CurNum-TempNum)/10;
	}
	cout << "So Max : "<< MaxNum << endl <<"So luong:"<<NumId[MaxNum]<< endl;

	return 0;
}
 


Nếu mình nhập vào một số âm cho CurNum thì chuyện gì sẽ xảy ra nhỉ? :-p
[Up] [Print Copy]
  [Question]   Re: giúp e bài tập c này với 21/03/2009 02:17:09 (+0700) | #13 | 173951
VaT
Member

[Minus]    0    [Plus]
Joined: 04/09/2008 00:17:52
Messages: 87
Offline
[Profile] [PM]
quanta : Mình gõ thiếu mất. Phải hiểu là "Cho số nguyên dương n . Xác định xem chữ số lớn nhất trong số n đó xuất hiện bao nhiêu lần"

FaL : Cũng được. Nhưng làm như thế để bạn hiểu dễ dàng hơn. Mình code nhanh nên chưa tối ưu.

choc_ : Tất nhiên là bị lỗi rồi smilie

Have nice day!
[Up] [Print Copy]
  [Question]   Re: giúp e bài tập c này với 21/03/2009 02:20:10 (+0700) | #14 | 173953
choc_
Member

[Minus]    0    [Plus]
Joined: 27/01/2009 06:46:01
Messages: 122
Offline
[Profile] [PM]
@VaT: lỗi đó nghiêm trọng àh nha. Trong trường hợp khác thì rất dễ crash hoặc thậm chí là chạy mã luôn (coi topic tìm lỗi chương trình C của mình). Mình đang suy nghĩ xem trong trường hợp này thì làm sao crash được chương trình của bạn.
[Up] [Print Copy]
  [Question]   Re: giúp e bài tập c này với 21/03/2009 09:13:26 (+0700) | #15 | 174039
[Avatar]
anglezero
Member

[Minus]    0    [Plus]
Joined: 19/03/2009 11:07:24
Messages: 19
Offline
[Profile] [PM]
anh quanta oi!
em cảm ơn anh,nhưng e chỉ mới học c và chỉ mới học được lệnh while và if với mấy lệnh cơ bản,nên e đọc ko hiểu
anh có biết cuốn sách c nào hay không
chỉ e học với
cảm ơn anh!
[Up] [Print Copy]
  [Question]   Re: giúp e bài tập c này với 21/03/2009 10:19:43 (+0700) | #16 | 174043
zerozeroone
Member

[Minus]    0    [Plus]
Joined: 24/12/2006 13:29:23
Messages: 149
Offline
[Profile] [PM]

anglezero wrote:
anh quanta oi!
em cảm ơn anh,nhưng e chỉ mới học c và chỉ mới học được lệnh while và if với mấy lệnh cơ bản,nên e đọc ko hiểu
anh có biết cuốn sách c nào hay không
chỉ e học với
cảm ơn anh! 

Prentice.Hall.The.ANSI.C.Programming.Language.2nd.Ed.Brian.W.Kernighan.And.Dennis.M.Ritchie
Apress_Beginning_C_From_Novice_to_Professional_4th_Edition_Oct.2006
[Up] [Print Copy]
  [Question]   Re: giúp e bài tập c này với 06/05/2009 02:33:26 (+0700) | #17 | 179622
toend2008
Member

[Minus]    0    [Plus]
Joined: 11/04/2009 03:01:03
Messages: 17
Offline
[Profile] [PM]
Mình cũng vừa học C được 1 tháng.Bài của bạn cái sai thứ nhất đó là khởi tạo idem=1, phải là 0 mới đúng.Bạn so sánh ở vòng lặp 2 bị sai.Mình sữa lại và chạy đúng.
Code:
#include<stdio.h> 
#include<conio.h> 

void main(void) 
{ 
int idem=0,n,dv,lc,ktra; 
printf("Ban nhap n = "); 
scanf("%d",&n); 
lc=n%10; 
ktra=n; 
while(n!=0) 
{ 
dv=n%10; 
if(dv>=lc) 
lc=dv; 
n=n/10; 
} 
while(ktra!=0) 
{ 
dv=ktra%10; 
if(lc==dv) 
idem++; 
ktra=ktra/10; 
} 
printf("Ket qua %d",idem); 
getch(); 
}
[Up] [Print Copy]
  [Question]   Re: giúp e bài tập c này với 06/05/2009 02:37:45 (+0700) | #18 | 179623
toend2008
Member

[Minus]    0    [Plus]
Joined: 11/04/2009 03:01:03
Messages: 17
Offline
[Profile] [PM]
Nói thêm vòng lặp đầu tiên của bạn anglezero kết thúc vòng lặp thì n=0 nên ở vòng lặp thứ 2 nó lấy n=0 để sài tiếp vì vậy mà kết quả luôn ra 0.Phải sử dụng lại ktra vì ta đã gán ktra=n ở đầu.
[Up] [Print Copy]
  [Question]   Re: giúp e bài tập c này với 16/05/2009 14:26:04 (+0700) | #19 | 180744
dra0011
Member

[Minus]    0    [Plus]
Joined: 16/05/2009 01:09:59
Messages: 2
Offline
[Profile] [PM] [Yahoo!]
mình post bài này bạn coi thử nha

#include<stdio.h>
#include<conio.h>
void main()
{
int vitri,dem,max;
char n,chuoi[80];
printf("nhap vao so n");
scanf("%d",&n);
vitri=0;
//bien tu chuoi string sang mang
while((chuoi[vitri++]=getchar()) !='\n');
chuoi[--vitri];
// kiem phan tu max
max=0
for (int i=0;1<vitri;i++)
if(chuoi[i]>max)
{
max=chuoi[i];
}
//dem so lan
dem=0
for(i=0;i<vitri;i++)
{
if(chuoi[i]==max)
dem=dem+1;
}
printf("%d","so lan ky tu max xuat hien la",dem);
getch();
}
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|